在Android中滚动Listview时CheckBox已检查或未检查

时间:2017-09-15 12:54:33

标签: android listview checkbox

我使用Textview和Checkbox创建了一个Listview。首先我保持所有项目都是默认检查。

但是当我取消选中该复选框并将其向下滚动以取消选中列表视图中的其他项目时,会检查旧版本。请帮我处理我的代码。

这是我的适配器类代码。

@Override
public View getView(final int position, View convertView, ViewGroup arg2) {

try {
    ViewHolder holder = new ViewHolder();

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();

    if (convertView == null) {

        convertView = layout_inflater.inflate(R.layout.dashbordmenu_listadapter, null);
        holder.txtMenutitle = (TextView) convertView.findViewById(R.id.txtPersonList);
        holder.checkAppList = (CheckBox) convertView.findViewById(R.id.checkPersonList);
        convertView.setTag(holder);
        convertView.setTag(R.id.txtPersonList, holder.txtMenutitle);
        convertView.setTag(R.id.checkPersonList, holder.checkAppList);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.checkAppList.setTag(position);
    holder.txtMenutitle.setText(arrayListDashboard1.get(position).getMenuTitle());
    holder.checkAppList.setChecked(arrayListDashboard1.get(position).isSelected());
    holder.checkAppList.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int selectPosition = (int) buttonView.getTag();
            if(buttonView.isChecked())
            {
                selectedAppId = arrayListDashboard1.get(selectPosition).getMenuId();
                Log.d("TEST","selectedAppId = "+selectedAppId);

            } else {
                notSelectedAppId = arrayListDashboard1.get(selectPosition).getMenuId();
                  Log.d("TEST","notSelectedAppId = "+notSelectedAppId);
            }
        }
    });

} catch (Exception e) {
    e.printStackTrace();
}
return convertView;
}
public class ViewHolder {
   TextView txtMenutitle;
   public CheckBox checkAppList;
  }

4 个答案:

答案 0 :(得分:1)

第一种方法:

在模型中添加布尔字段。将其设置为默认值true。如果未选中复选框,则将布尔字段设为false。根据布尔字段更新您的复选框。

第二种方法:

使用 SparseBooleanArray ,在适配器中初始化SparseBooleanArray。它将保持positon和boolean值。因此,您可以保留复选框值。

SparseBooleanArray文档:

  

与普通的布尔数组不同,指数可能存在差距。   它旨在比使用HashMap映射更具内存效率   对Booleans的整数,因为它避免了自动装箱键和   值及其数据结构不依赖于额外的条目对象   对于每个映射。

第三种方法:

正如LunarWatcher所说,只需初始化布尔的ArrayList并更新你的复选框。

答案 1 :(得分:0)

在你的模型中,取一个布尔值来保持复选框的记录是否被检查,并在绑定视图时使用它

答案 2 :(得分:0)

RecylerView在滚动时重新使用视图,因此您必须为每个列表项设置复选框的状态。在BindViewHolder中,您将检查位置的状态并相应地设置复选框的状态。

答案 3 :(得分:0)

将布尔变量'isCheck'设置为模型类并将其设置为默认值false。根据复选框值更改为true或false,将其设置为此值。 并检查复选框更改事件isCheck是真还是假。