这篇博客介绍了如何使用Kotlin在Android的RecyclerView中实现单选、多选和反选功能。博主分享了关键代码,并提供了反选功能的实现方法。此外,还批评了网络上不试用就直接转载或收费下载的现象,鼓励读者尝试并分享自己的实现方式。 摘要由CSDN通过智能技术生成

单选关键代码

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val fruit = fruitList[position]
        if (fruit.isChecked) {
            holder.binding.check.setImageResource(R.drawable.checked)
        } else {
            holder.binding.check.setImageResource(R.drawable.unchecked)
        holder.binding.fruitImage.setImageResource(fruit.imageId)
        holder.binding.fruitName.text = fruit.name
        holder.binding.root.setOnClickListener {
            mOnItemClickListener?.onItemClick(position)
            if (checkPos != position) {
                //取消上一个位置的勾选状态
                fruitList[checkPos].isChecked = false
                notifyItemChanged(checkPos)
                //设置新的勾选状态
                checkPos = holder.bindingAdapterPosition
                fruitList[checkPos].isChecked = true
                notifyItemChanged(checkPos)

多选关键代码

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val fruit = fruitList[position]
        if (fruit.isChecked) {
            holder.binding.check.setImageResource(R.drawable.checked)
        } else {
            holder.binding.check.setImageResource(R.drawable.unchecked)
        holder.binding.fruitImage.setImageResource(fruit.imageId)
        holder.binding.fruitName.text = fruit.name
        holder.binding.root.setOnClickListener {
                if (fruitList[position].isChecked) {
                    fruit.isChecked = false
                    notifyItemChanged(position)
                } else {
                    fruit.isChecked = true
                    notifyItemChanged(position)
            checkList.clear()
            fruitList.forEach {
                if (it.isChecked) {
                    checkList.add(it)
        mOnItemClickListener?.onItemClick(position, checkList)

实现反选的关键代码

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val fruit = fruitList[position]
        if (fruit.isChecked) {
            holder.binding.check.setImageResource(R.drawable.checked)
        } else {
            holder.binding.check.setImageResource(R.drawable.unchecked)
        holder.binding.fruitImage.setImageResource(fruit.imageId)
        holder.binding.fruitName.text = fruit.name
        holder.binding.root.setOnClickListener {
            if (fruitList[position].isChecked) {
                fruit.isChecked = false
                notifyItemChanged(position)
            } else {
                fruit.isChecked = true
                notifyItemChanged(position)
            checkList.clear()
            fruitList.forEach {
                if (it.isChecked) {
                    checkList.add(it)
        mOnItemClickListener?.onItemClick(position, checkList)
     * 反选方法
     * @return List<Fruit> 返回返选后的集合
    fun setInvertSelection(): List<Fruit> {
        val newList = ArrayList<Fruit>()
        fruitList.forEach {
            if (!it.isChecked) {
                newList.add(it)
        fruitList.forEach {
            it.isChecked = !it.isChecked
        notifyDataSetChanged()
        return newList
     * 清除所有所选
    fun setClear() {
        fruitList.forEach {
            if (it.isChecked) {
                it.isChecked = false
        notifyDataSetChanged()
  1. 编写语言:kotlin(什么?不会kotlin?学吧kotlin yyds!)
  2. 实现的方法其实有很多种,自己觉得这个更简单粗暴点吧(就是自己菜不会优化)
  3. 可能对超级新手或者学习recyclerview的同学有点用吧。
  4. 有其他实现方式的大佬可以在评论区贴出你的地址大家一起学习进步
  5. 觉得有用的同学可以点个赞或者评论个yyds
  6. 这种小功能百度上一堆抄袭的自己试都不试直接转载或者贴个下载地址让你付费下载的真的是ex!
  7. 直接贴源码⬇️⬇️⬇️ 如果你上不了github评论区讲下,我传gitee
  8. GITHUB
一.RecyclerView + CheckBox勾选混乱问题解决RecyclerView中使用CheckBox时因为RecyclerView布局会重用,所以在勾选时出现勾选混乱。如图勾选 0号位和2号位 21 23也被勾选了。此时适配器中的代码@Override public void onBindViewHolder(ViewHolder holder, final int position)...
一 概述: 这篇文章需求来源还是比较简单的,但做的优雅仍有值得挖掘的地方。 需求来源:一个类似饿了么这种电商优惠券的选择界面:其实就是 一个普通的列表,实现单选功能,效果如图:(不要怪图渣了,我撸了四五遍,公司录出来的GIF就这么渣。。。) 常规方法:在Javabean里增加一个boolean isSelected字段,并在Adapter里根据这个字段的值设置“CheckBox...
private void setProperHeightOfView() { View layoutView = getView().findViewById( R.id.layout ); if (layoutView!=null) { ViewGroup.LayoutParams layoutParams = layoutView.getLayoutParams(); if (layoutParams!=null) { layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; layoutView.requestLayout(); ViewPager2+Tablayout+Fragment高度异常问题 惜願當年: 延时几十毫秒再执行onPageSelected。因为page被选中的时候,fragment中还没有来得及获取view的高度。是null所以就没办法改变高度。 ViewPager2+Tablayout+Fragment高度异常问题 小楼昨夜又秋风: ViewPager2+Tablayout+Fragment高度异常问题 蓝莲花wsg: stackoverflow无敌 ViewPager2+Tablayout+Fragment高度异常问题 newTNTTNT: 第一次进来不显示。切换tab后才显示