glmis项目工作日志4_解决RecyclerView中使用CheckBox时出现数据错乱的问题。

这几天遇到个问题,在RecyclerView的item中使用CheckBox时由于其复用机制,如果我们没有用数据来控制CheckBox状态的话,将会导致CheckBox的显示在列表中错。比如说你只对第一个Item中的CheckBox做了选中操作,当列表向上滚动的时候,你会发现,下面的Item中居然也会有被选中的。

解决思路就是在数据源里保存被选中的状态。


为了解决这个问题,我找到了这篇文章,Android Checkbox详解
但是按照里面的方法尝试后并没解决这个问题。

然后我在Stack Overflow看到有人跟我遇到相同的问题,传送门在这

在绑定ViewHolder时保存被选中的状态即可。

public class AdapterTrashIncome extends RecyclerView.Adapter<AdapterTrashIncome.ViewHolder> {

    private ArrayList myItems = new ArrayList<>();

    public AdapterTrashIncome(ArrayList getItems, Context context){
        try {
            mContext = context;
            myItems = getItems;
            }catch (Exception e){
            Log.e(FILE_NAME, "51: " + e.toString());
            e.printStackTrace();
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;
        public CheckBox cbSelect;

        public ViewHolder(View v) {
            super(v);
            tvContent = (TextView) v.findViewById(R.id.tvContent);
            cbSelect = (CheckBox) v.findViewById(R.id.cbSelect);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final ObjectIncome objIncome = myItems.get(position);
        String content = "lalalla";
        holder.tvContent.setText(Html.fromHtml(content));

        //in some cases, it will prevent unwanted situations
        holder.cbSelect.setOnCheckedChangeListener(null);

        //if true, your checkbox will be selected, else unselected
        holder.cbSelect.setChecked(objIncome.isSelected());

        holder.cbSelect.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    //set your object's last status
                    objIncome.setSelected(isChecked);
            }
        });

    }
}

你可能感兴趣的:(项目glmis)