RecyclerView與CheckBox結合使用錯亂問題
阿新 • • 發佈:2019-02-03
RecyclerView是當前流行的資料檢視展示框架
但是,當我們使用RecyclerView與CheckBox結合使用時,碰撞出了勾選錯亂的火花
那麼接下來我們就來粗暴的解決掉這個小火星
首先,我們來看程式碼
private Context context; private List<MyBean> list;
//首先我們要例項化一個SparseBooleanArray,這個集合物件是Android官方自帶的,想了解的可以瞭解一下
https://www.sogou.com/sie?hdq=AQxRG-0000&query=SparseBooleanArray&ie=utf8private SparseBooleanArray mCheckStates=new SparseBooleanArray(); //介面卡 public MyAdapter(Context context, List<MyBean> list) { this.context = context; this.list = list; }
//在onCreateView中基本沒什麼變化
@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(context).inflate(R.layout.iten_shop,null); MyViewHolder myViewHolder=new MyViewHolder(view); return myViewHolder; }
@Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.cb.setTag(position);//在最開始適配的時候,將每一個CheckBox設定一個當前的Tag值,這樣每個CheckBox都有了一個固定的標識 holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isCheckBox) { int pos= (int) buttonView.getTag();//得到當前CheckBox的Tag值,由於之前儲存過,所以不會出現索引錯亂 if (isCheckBox){
//點選時將當前CheckBox的索引值和Boolean存入SparseBooleanArray中 mCheckStates.put(pos,true); }else {
//否則將 當前CheckBox物件從SparseBooleanArray中移除
mCheckStates.delete(pos);
}
} });
//得到CheckBox的Boolean值後,將當前索引的CheckBox狀態改變 holder.cb.setChecked(mCheckStates.get(position,false)); if(holder.cb.isChecked()){ System.out.println("==選中了="); }else{ System.out.println("==取消了="); } }
class MyViewHolder extends RecyclerView.ViewHolder{ private final CheckBox cb; public MyViewHolder(View itemView) { super(itemView); cb = itemView.findViewById(R.id.ckb_dan); } }
----至此,CheckBox錯亂問題完美解決了,怎麼樣,是不是很簡單