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);
}

 

尊重作者劳动成果:https://blog.csdn.net/lixiaoshuai_91/article/details/80083582

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在RecyclerView实现单选的示例代码: 1. 首先,在RecyclerView的Adapter中添加一个成员变量来保存当前选中的位置: ```java private int mSelectedPosition = -1; ``` 2. 在ViewHolder的构造函数中设置itemView的点击事件,用于处理单选逻辑: ```java public MyViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取当前点击的位置 int position = getAdapterPosition(); // 如果当前位置已经选中,则不做处理 if (position == mSelectedPosition) { return; } // 取消上一个选中的状态 notifyItemChanged(mSelectedPosition); // 设置新的选中状态 mSelectedPosition = position; notifyItemChanged(mSelectedPosition); } }); } ``` 3. 在Adapter的onBindViewHolder方法中根据当前位置是否选中来设置itemView的状态: ```java @Override public void onBindViewHolder(MyViewHolder holder, int position) { // 设置itemView的状态 if (position == mSelectedPosition) { holder.itemView.setSelected(true); } else { holder.itemView.setSelected(false); } // 其他操作 } ``` 注意:在itemView的布局文件中需要将android:background属性设置为可选中状态,例如: ```xml <LinearLayout android:id="@+id/item_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" android:orientation="vertical"> <!-- 其他控件 --> </LinearLayout> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值