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

扫描二维码关注公众号,回复: 116223 查看本文章

以上两种方式实现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);
}

猜你喜欢

转载自blog.csdn.net/lixiaoshuai_91/article/details/80083582