【问题标题】:Automatic check box selection in android custom listviewandroid自定义列表视图中的自动复选框选择
【发布时间】:2016-05-31 14:11:41
【问题描述】:

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

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

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);

【问题讨论】:

  • 请贴一些代码
  • holder.cb.setChecked(sba.get(position));你为什么这样做?

标签: android listview checkbox


【解决方案1】:

为此,您必须将选中的复选框状态保持在模型类的 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);

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多