說下前幾天遇到的一個小問題,關於RecyclerView條目選中狀態的保存.衆所周知,RecyclerView被創造出來用於條目的回收利用,可是,當前面回收的條目帶有一些特殊的狀態(區別於未選中狀態),那麼滑動的時候,後面的條目會重複這些狀態,因而你的視圖就徹底混亂了,這並非你想要的效果,那麼就頗有必要來談談這個選中狀態的複用了.ide
此外,條目的選中與未選中狀態,相似於一個CheckBox的勾選狀態,咱們不妨假設RecyclerView列表條目中有一個CheckBox(能夠根據這個CheckBox的勾選狀態來顯示不一樣的視圖,CheckBox的樣式很靈活,不影響你的佈局效果),那麼關於CheckBox的狀態保存就是如今要討論的問題了.佈局
CheckBox有它本身的選中監聽,選中狀態isChecked=true時,你能夠顯示選中視圖;非選中狀態isChecked=false時,你能夠顯示非選中視圖;單個條目的選中狀態是沒有問題的,一旦滑動,那麼問題就來了,後面未選中的條目複用了以前的條目的選中狀態,因而就形成了混亂.spa
若是咱們記錄並儲存位置和選中的狀態,在RecyclerView.Adapter的onBindViewHolder中,根據當前position去取出該位置的狀態,而後根據狀態來顯示相應的視圖,就能搞定了.code
還有一種作法也很容易想到,那就是把CheckBox的選中狀態做爲填充數據bean的一個字段屬性,那麼每次建立條目,即走onBindViewHolder方法時,都拿出bean中的isChecked屬性,根據這個屬性來判斷當前應該顯示什麼樣的視圖.blog
說下本身的實現方式吧,按常理應該用個雙列集合map來保存位置和選中的狀態,我不想這麼作,我用一個List<Integer> posList來記錄選中的位置,再在RecyclerView.Adapter的onBindViewHolder中判斷當前的position是否在這個集合中,而後事件
mHolder.cb.setChecked(posList.contains(position) ? true : false);這樣就能夠正常顯示選中條目的視圖了;值得注意的是在CheckBox的選中事件中動態地根據選中與否來到posList集合中添加或異常該position.rem
Talk is cheap , show me the code.it
mHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { mHolder.iv_state.setImageResource(b ? R.drawable.selected : R.drawable.unchecked); if (b) { if (!posList.contains(position)) { posList.add(position); } //數據操做 } else { if (posList.contains(position)) { int i = posList.indexOf(position); posList.remove(i); } //數據操做 } } }); mHolder.cb.setChecked(posList.contains(position) ? true : false);
之前遇到問題,老是沒有去梳理、記錄和總結 , 弄得好像每次都是遇到一個新問題同樣 , 這個問題我記得處理過屢次了.分析其原理,總結應對方法, 但願下次再碰到 , 能信手拈來 , 遊刃有餘...io