Android 滚动自定义列表视图后取消选中复选框。。。!
我创建自定义listview,并将复选框放入其中。Android 滚动自定义列表视图后取消选中复选框。。。!,android,listview,checkbox,Android,Listview,Checkbox,我创建自定义listview,并将复选框放入其中。首先我选中所有复选框,然后向下滚动listview,然后选中复选框
首先我选中所有复选框,然后向下滚动listview,然后选中复选框<我该怎么办?
CustomListItem.java
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp" >
<TextView
android:id="@+id/txtMainTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is Sample Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="130dp" >
<LinearLayout
android:layout_width="150dp"
android:layout_height="wrap_content"
android:paddingRight="15dp" >
<CheckBox
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
<ImageView
android:id="@+id/imgMainImage"
android:layout_width="100dp"
android:layout_height="fill_parent" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtSubTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:text="This is Sample Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="16dp" />
<TextView
android:id="@+id/txtTimeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is Sample Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="12dp" />
<HorizontalScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp" >
<ImageView
android:id="@+id/imgAnimal"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_animal" />
<ImageView
android:id="@+id/imgCar"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_car" />
<ImageView
android:id="@+id/imgEnvironment"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_environment" />
<ImageView
android:id="@+id/imgPlant"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_plant" />
<ImageView
android:id="@+id/imgMap"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/tab_icon_map" />
<ImageView
android:id="@+id/imgWarning"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/warning_icon" />
</LinearLayout>
</HorizontalScrollView>
<HorizontalScrollView
android:id="@+id/scrollView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imgMap2"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/tab_icon_map" />
<ImageView
android:id="@+id/imgWarining2"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/warning_icon" />
<ImageView
android:id="@+id/imgDownload"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/download_icon" />
<ImageView
android:id="@+id/imgShare"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/share_icon" />
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_toRightOf="@+id/text1"
android:background="#FF9900" />
</LinearLayout>
</LinearLayout>
当您在
列表视图中使用复选框时,列表视图存在一个问题,即复选框的选中状态将不会由Android
维护,因为当您滚动列表视图
时,它将使用getView()为每一行生成新的视图
方法和垃圾收集器
将删除上述所有视图
以腾出空间,因此复选框
状态也将被垃圾收集器
销毁或垃圾。您可以通过以下示例解决此问题:
Main.xml
<relativelayout
android:layout_height="match_parent"
android:layout_width="match_parent"
tools:context=".Main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<listview
android:divider="#000"
android:dividerheight="0.8dp"
android:id="@+id/listView1"
android:layout_alignparentleft="true"
android:layout_alignparenttop="true"
android:layout_height="match_parent"
android:layout_width="match_parent">
</listview>
<button
android:id="@+id/button1"
android:layout_alignparenttop="true"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="Check Selected">
</button>
</relativelayout>
<relativelayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<textview
android:id="@+id/textView1"
android:layout_alignparentleft="true"
android:layout_alignparenttop="true"
android:layout_height="wrap_content"
android:layout_marginbottom="10dp"
android:layout_margintop="10dp"
android:layout_width="wrap_content"
android:text="Medium Text"
android:textappearance="?android:attr/textAppearanceMedium">
</textview>
<checkbox
android:focusable="false"
android:focusableintouchmode="false"
android:id="@+id/checkBox1"
android:layout_alignbaseline="@+id/textView1"
android:layout_alignbottom="@+id/textView1"
android:layout_alignparentright="true"
android:layout_height="wrap_content"
android:layout_marginright="16dp"
android:layout_width="wrap_content">
</checkbox>
</relativelayout>
list_item.xml
<relativelayout
android:layout_height="match_parent"
android:layout_width="match_parent"
tools:context=".Main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<listview
android:divider="#000"
android:dividerheight="0.8dp"
android:id="@+id/listView1"
android:layout_alignparentleft="true"
android:layout_alignparenttop="true"
android:layout_height="match_parent"
android:layout_width="match_parent">
</listview>
<button
android:id="@+id/button1"
android:layout_alignparenttop="true"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="Check Selected">
</button>
</relativelayout>
<relativelayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<textview
android:id="@+id/textView1"
android:layout_alignparentleft="true"
android:layout_alignparenttop="true"
android:layout_height="wrap_content"
android:layout_marginbottom="10dp"
android:layout_margintop="10dp"
android:layout_width="wrap_content"
android:text="Medium Text"
android:textappearance="?android:attr/textAppearanceMedium">
</textview>
<checkbox
android:focusable="false"
android:focusableintouchmode="false"
android:id="@+id/checkBox1"
android:layout_alignbaseline="@+id/textView1"
android:layout_alignbottom="@+id/textView1"
android:layout_alignparentright="true"
android:layout_height="wrap_content"
android:layout_marginright="16dp"
android:layout_width="wrap_content">
</checkbox>
</relativelayout>
Main.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class Main extends Activity implements OnItemClickListener{
ListView apps;
PackageManager packageManager;
ArrayList <String> checkedValue;
Button bt1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1 = (Button) findViewById(R.id.button1);
apps = (ListView) findViewById(R.id.listView1);
packageManager = getPackageManager();
final List <PackageInfo> packageList = packageManager
.getInstalledPackages(PackageManager.GET_META_DATA); // all apps in the phone
final List <PackageInfo> packageList1 = packageManager
.getInstalledPackages(0);
try {
packageList1.clear();
for (int n = 0; n < packageList.size(); n++)
{
PackageInfo PackInfo = packageList.get(n);
if (((PackInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) != true)
//check weather it is system app or user installed app
{
try
{
packageList1.add(packageList.get(n)); // add in 2nd list if it is user installed app
Collections.sort(packageList1,new Comparator <PackageInfo>()
// this will sort App list on the basis of app name
{
public int compare(PackageInfo o1,PackageInfo o2)
{
return o1.applicationInfo.loadLabel(getPackageManager()).toString()
.compareToIgnoreCase(o2.applicationInfo.loadLabel(getPackageManager())
.toString());// compare and return sorted packagelist.
}
});
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
Listadapter Adapter = new Listadapter(this,packageList1, packageManager);
apps.setAdapter(Adapter);
apps.setOnItemClickListener(this);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this,"" + checkedValue,Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onItemClick(AdapterView arg0, View v, int position, long arg3) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);
TextView tv = (TextView) v.findViewById(R.id.textView1);
cb.performClick();
if (cb.isChecked()) {
checkedValue.add(tv.getText().toString());
} else if (!cb.isChecked()) {
checkedValue.remove(tv.getText().toString());
}
}
}
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class Listadapter extends BaseAdapter{
List <PackageInfo> packageList;
Activity context;
PackageManager packageManager;
boolean[] itemChecked;
public Listadapter(Activity context, List <PackageInfo> packageList,
PackageManager packageManager) {
super();
this.context = context;
this.packageList = packageList;
this.packageManager = packageManager;
itemChecked = new boolean[packageList.size()];
}
private class ViewHolder {
TextView apkName;
CheckBox ck1;
}
public int getCount() {
return packageList.size();
}
public Object getItem(int position) {
return packageList.get(position);
}
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.apkName = (TextView) convertView
.findViewById(R.id.textView1);
holder.ck1 = (CheckBox) convertView
.findViewById(R.id.checkBox1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PackageInfo packageInfo = (PackageInfo) getItem(position);
Drawable appIcon = packageManager
.getApplicationIcon(packageInfo.applicationInfo);
String appName = packageManager.getApplicationLabel(
packageInfo.applicationInfo).toString();
appIcon.setBounds(0, 0, 40, 40);
holder.apkName.setCompoundDrawables(appIcon, null, null, null);
holder.apkName.setCompoundDrawablePadding(15);
holder.apkName.setText(appName);
holder.ck1.setChecked(false);
if (itemChecked[position])
holder.ck1.setChecked(true);
else
holder.ck1.setChecked(false);
holder.ck1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.ck1.isChecked())
itemChecked[position] = true;
else
itemChecked[position] = false;
}
});
return convertView;
}
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
导入android.app.Activity;
导入android.content.pm.ApplicationInfo;
导入android.content.pm.PackageInfo;
导入android.content.pm.PackageManager;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.Button;
导入android.widget.CheckBox;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
公共类Main扩展活动实现了McClickListener{
列表视图应用程序;
包装管理器包装管理器;
ArrayList校验值;
按钮bt1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1=(按钮)findViewById(R.id.button1);
apps=(ListView)findViewById(R.id.listView1);
packageManager=getPackageManager();
最终列表包装商=包装经理
.getInstalledPackages(PackageManager.GET_META_DATA);//手机中的所有应用程序
最终列表packageList1=packageManager
.getInstalledPackages(0);
试一试{
packageList1.clear();
对于(int n=0;n
Listadapter.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class Main extends Activity implements OnItemClickListener{
ListView apps;
PackageManager packageManager;
ArrayList <String> checkedValue;
Button bt1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1 = (Button) findViewById(R.id.button1);
apps = (ListView) findViewById(R.id.listView1);
packageManager = getPackageManager();
final List <PackageInfo> packageList = packageManager
.getInstalledPackages(PackageManager.GET_META_DATA); // all apps in the phone
final List <PackageInfo> packageList1 = packageManager
.getInstalledPackages(0);
try {
packageList1.clear();
for (int n = 0; n < packageList.size(); n++)
{
PackageInfo PackInfo = packageList.get(n);
if (((PackInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) != true)
//check weather it is system app or user installed app
{
try
{
packageList1.add(packageList.get(n)); // add in 2nd list if it is user installed app
Collections.sort(packageList1,new Comparator <PackageInfo>()
// this will sort App list on the basis of app name
{
public int compare(PackageInfo o1,PackageInfo o2)
{
return o1.applicationInfo.loadLabel(getPackageManager()).toString()
.compareToIgnoreCase(o2.applicationInfo.loadLabel(getPackageManager())
.toString());// compare and return sorted packagelist.
}
});
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
Listadapter Adapter = new Listadapter(this,packageList1, packageManager);
apps.setAdapter(Adapter);
apps.setOnItemClickListener(this);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this,"" + checkedValue,Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onItemClick(AdapterView arg0, View v, int position, long arg3) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);
TextView tv = (TextView) v.findViewById(R.id.textView1);
cb.performClick();
if (cb.isChecked()) {
checkedValue.add(tv.getText().toString());
} else if (!cb.isChecked()) {
checkedValue.remove(tv.getText().toString());
}
}
}
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class Listadapter extends BaseAdapter{
List <PackageInfo> packageList;
Activity context;
PackageManager packageManager;
boolean[] itemChecked;
public Listadapter(Activity context, List <PackageInfo> packageList,
PackageManager packageManager) {
super();
this.context = context;
this.packageList = packageList;
this.packageManager = packageManager;
itemChecked = new boolean[packageList.size()];
}
private class ViewHolder {
TextView apkName;
CheckBox ck1;
}
public int getCount() {
return packageList.size();
}
public Object getItem(int position) {
return packageList.get(position);
}
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.apkName = (TextView) convertView
.findViewById(R.id.textView1);
holder.ck1 = (CheckBox) convertView
.findViewById(R.id.checkBox1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PackageInfo packageInfo = (PackageInfo) getItem(position);
Drawable appIcon = packageManager
.getApplicationIcon(packageInfo.applicationInfo);
String appName = packageManager.getApplicationLabel(
packageInfo.applicationInfo).toString();
appIcon.setBounds(0, 0, 40, 40);
holder.apkName.setCompoundDrawables(appIcon, null, null, null);
holder.apkName.setCompoundDrawablePadding(15);
holder.apkName.setText(appName);
holder.ck1.setChecked(false);
if (itemChecked[position])
holder.ck1.setChecked(true);
else
holder.ck1.setChecked(false);
holder.ck1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.ck1.isChecked())
itemChecked[position] = true;
else
itemChecked[position] = false;
}
});
return convertView;
}
}
import java.util.List;
导入android.app.Activity;
导入android.content.pm.PackageInfo;
导入android.content.pm.PackageManager;
导入android.graphics.drawable.drawable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.TextView;
公共类Listadapter扩展了BaseAdapter{
包装商名单;
活动语境;
包装管理器包装管理器;
布尔[]项检查;
公共Listadapter(活动上下文、列表packageList、,
软件包管理器(软件包管理器){
超级();
this.context=上下文;
this.packageList=packageList;
this.packageManager=packageManager;
itemChecked=新布尔值[packageList.size()];
}
私有类视窗持有者{
文本视图;
复选框ck1;
}
public int getCount(){
返回packageList.size();
}
公共对象getItem(int位置){
返回包装商。获取(位置)