android自定义列表视图中的自动复选框选择

时间:2016-05-31 05:33:59

标签: android listview checkbox

`我是android的新手并构建一个列表,该列表包含已安装的应用程序名称和CheckBox,以选择要卸载哪个。例如,问题是当列表变得比电话屏幕更长并且滚动是活动的时候;当我选中一个复选框时,会在列表底部自动选择第二个复选框。

问题是复选框的自动复选框选择,plz帮助我。

public View getView(final int position, View convertView, ViewGroup parent) 
{

        LayoutInflater inflater = context.getLayoutInflater();

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.ultimate, null);
            holder = new ViewHolder();


            holder.apkName = (TextView) convertView.findViewById(R.id.appName);
            holder.apkInstall=(TextView)convertView.findViewById(R.id.appMemory);
            holder.cb=(CheckBox)convertView.findViewById(R.id.cb);




            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, 50, 50);
        holder.apkName.setCompoundDrawables(appIcon, null, null, null);
        holder.apkName.setCompoundDrawablePadding(15);
        holder.apkName.setText(appName);


        holder.cb.setTag(position);

2 个答案:

答案 0 :(得分:1)

为此,您必须将已选中的复选框状态保存到Model Class的ArrayList中。它将反映到您的适配器,然后进入列表视图。首先制作如下的模型类,

public class Model{
 String name;
 int value; /* 0 -> checkbox disable, 1 -> checkbox enable */

 Model(String name, int value){
 this.name = name;
 this.value = value;
 }
 public String getName(){
 return this.name;
 }
 public int getValue(){
 return this.value;
 }

}

然后在您的适配器中使您的代码看起来像这样,

public class CustomAdapter extends ArrayAdapter<Model>{
 Model[] modelItems = null;
 Context context;
 public CustomAdapter(Context context, Model[] resource) {
 super(context,R.layout.row,resource);
 // TODO Auto-generated constructor stub
 this.context = context;
 this.modelItems = resource;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 // TODO Auto-generated method stub
 LayoutInflater inflater = ((Activity)context).getLayoutInflater();
 convertView = inflater.inflate(R.layout.row, parent, false); 
 TextView name = (TextView) convertView.findViewById(R.id.textView1);
 CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
 name.setText(modelItems[position].getName());
 if(modelItems[position].getValue() == 1)
 cb.setChecked(true);
 else
 cb.setChecked(false);
 return convertView;
 }
}

现在从您的活动中将复选框列表传递到适配器,如下所示:

lv = (ListView) findViewById(R.id.listView1);
 modelItems = new Model[5];
 modelItems[0] = new Model("pizza", 0);
 modelItems[1] = new Model("burger", 1);
 modelItems[2] = new Model("olives", 1); 
 modelItems[3] = new Model("orange", 0); 
 modelItems[4] = new Model("tomato", 1); 
 CustomAdapter adapter = new CustomAdapter(this, modelItems);
 lv.setAdapter(adapter);

现在,如果用户选中/取消选中任何复选框,只需更改其模型类中的值并通知适配器。

答案 1 :(得分:1)

每当需要显示列表视图项时滚动列表视图,它将调用getView来创建或获取布局。因此,您需要在模型类中使用布尔变量检查是否已检查,并根据boolan值使复选框视图处于选中状态。当用户选中复选框时,您应该更新模型的布尔值。

您的模型类应包含一个变量,表示是否选中该复选框。

public class Model{
   .....
   boolean isChecked; //true if checkbox is checked
   .....
} 

在你的适配器类中,在getView()中。 您应该使用isChecked变量检查是否已选中。

if(isChecked){
    holder.cb.setChecked(true);
} else {
    holder.cb.setChecked(false);
}