RecyclerView實現單選的三種方式

今天給大家分享下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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章