RecyclerView+checkbox滑動導致複用混亂問題的解決方案
阿新 • • 發佈:2019-02-15
最近做一個專案,裡面遇到了一個小問題吧我覺得這些問題也是我們時常會用到的。我們需要在使用者新註冊的時候為他推薦一些人來選擇關注。用到了RecyclerView 那麼在RecyclerView的Adapter裡面用到的是checkbox讓使用者有選擇的進行關注,當列表足夠多的時候這時下拉就會產生checkbox複用的混亂問題,我們發現,我們選擇或者取消選擇再下拉時連位置都改變了。讓人非常煩惱。下面就來看看我的解決方案吧:
1:在RecyclerView的Adapter裡面new一個map集合,用來存放checkbox的選擇狀態 下面貼下程式碼:
// 儲存勾選框狀態的map集合 解決滑動的複用問題2:在adapter被初始化的時候,給checkbox一個預設的選中狀態,我這裡預設選中的是true:private Map<Integer, Boolean> map = new HashMap<>();
public SuggestAdapter(SuggestActivity suggestActivity, List<SuggestBean.ListBean> anchorDatas) { this.mDatas=anchorDatas; this.suggestActivity = suggestActivity; initMap3:在繫結viewholder裡面設定預設的選中狀態並且設定checkbox的選中監聽事件,在選中監聽事件里根據ischeck的狀態來修改map集合:(); } private void initMap() { for (int i = 0; i < mDatas.size(); i++) { map.put(i, true); } }
} @Override public void onBindViewHolder(ViewHolder holder, int position) { try { holder.tvAnchorNickname好啦。那麼這個問題就完美的解決了哦。.setText(mDatas.get(position).getNickname()); XImageLoader.load(suggestActivity,mDatas.get(position).getIcon(),holder.ivSuggestedAnchorIcon); holder.cbAnchorChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { map.put(position, isChecked); } }); if (map.get(position) == null) { map.put(position, false); } holder.cbAnchorChecked.setChecked(map.get(position)); }catch (Exception e){ e.printStackTrace(); } }
假如我們在activity需要根據checkbox的狀態來做一些操作,我們可以在adapter裡面寫一個方法返回map,這樣我們就可以在activity得到map資料啦。
adapter中getData方法:
public Map<Integer, Boolean> getData() { return map; }Activity中通過Adapter的.getData()方法得到map
Map<Integer, Boolean> map = suggestAdapter.getData(); Iterator iterator=map.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry entry = (Map.Entry) iterator.next(); int key = (int) entry.getKey(); Boolean value = (Boolean) entry.getValue(); if(value==true){ suggestPresenter.setConcern(this,AnchorDatas.get(key).getUid(),"1"); } }
最後請大家多多支援:歡迎關注公眾號:石頭鋪 微訊號:Android_Programmer 每天都會更新安卓技術文章和一些解決方法。謝謝大家