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