今天給大家分享下RecyclerView實現單選的三種方式,這三種方式都需要一個標識位,mPosition
單選的話建議大家不要使用checkBox(android不同版本checkBox顯示的不一樣哦),使用一個ImageView代替是最理想的
在Adapter裏面首先初始化我們的標識位 int mPosition=-1;
第一種方式就是刷新列表,使用notifyDataSetChanged();
下面貼下代碼
if (mPosition == position) { myviewholders.mIvCheck.setImageResource(R.mipmap.icon_no); mPosition = -1; } else if (mPosition != position) { myviewholders.mIvCheck.setImageResource(R.mipmap.icon); mPosition = position; notifyDataSetChanged(); }
這種實現的方式簡單粗暴,但是佔用內存比較多,每改變一次選擇都會從走onBindViewHolder一個屏幕條目個數次
第二種方式是刷新單個的Item事件,使用notifyItemChanged(positio)
代碼如下
if (mPosition == position) { myList.get(mPosition).setCheck(false); notifyItemChanged(position); mPosition = -1; } else if (mPosition != position && mPosition != -1) { //先取消上個item的勾選狀態 notifyItemChanged(mPosition); //設置新Item的勾選狀態 mPosition = position; notifyItemChanged(position); } else if (mPosition == -1) { mPosition = position; myList.get(position).setCheck(true); notifyItemChanged(position); }
這種方式佔用內存不高,只刷新單個Item
以上兩種方式實現RecyclerView單選都有一個缺陷,就是若Item裏面有圖片的話會有一個切換圖片的閃爍
下面開始放大招了哦
第三種實現只改變單個Item中的選擇按鈕 setImageResource() 強烈推薦
代碼如下
if (mPosition == position) { Myviewholders vhNew = (Myviewholders) myRecycle.findViewHolderForLayoutPosition(mPosition); vhNew.mIvCheck.setImageResource(R.mipmap.icon_no); mPosition = -1; } else if (mPosition != -1) { Myviewholders couponVH = (Myviewholders) myRecycle.findViewHolderForLayoutPosition(mPosition); if (couponVH != null) {//還在屏幕裏 couponVH.mIvCheck.setImageResource(R.mipmap.icon_no); } else { //些極端情況,holder被緩存在Recycler的cacheView裏, //此時拿不到ViewHolder,但是也不會回調onBindViewHolder方法。所以add一個異常處理 notifyItemChanged(mPosition); } //設置新Item的勾選狀態 mPosition = position; Myviewholders vhNew = (Myviewholders) myRecycle.findViewHolderForLayoutPosition(mPosition); vhNew.mIvCheck.setImageResource(R.mipmap.icon); } else if (mPosition == -1) { Myviewholders couponVH = (Myviewholders) myRecycle.findViewHolderForLayoutPosition(position); //設置新Item的勾選狀態 mPosition = position; couponVH.mIvCheck.setImageResource(R.mipmap.icon); }
這種實現方式唯一的缺陷就是要在創建Adapter的時候要傳入RecyclerView的對象,用來獲取到單個Item的findViewHolderForLayoutPosition(position),有了單個Item的實例我們就可以操作item的View了,此方法可能很多人沒有見過吧,因爲用的確實比較少,代碼量也比較多;但這確實是RecyclerView的高級階段才用的到的哦
切換單選標記的ImageView的代碼也貼出來啦,要是有需要源碼的可以留言哦
myviewholders.mIvCheck.setImageResource(R.mipmap.icon_no); //先重置一下選擇標記爲未選擇 if (mPosition == position) { myviewholders.mIvCheck.setImageResource(R.mipmap.icon); }