Android使用RecyclerView实现列表数据选择操作

发布时间 - 2026-01-11 01:59:35    点击率:

这些时间做安卓盒子项目,因为安卓电视的显示器比较大,所以一个界面显示 很多数据 ,最多的时候,一个Actvity中用到了好几个RecyclerView。

在RecyclerView中实现Item选中处理时,发现用CheckBox的OnCheckedChangeListener监听事件时,会达不到预期,所以用了OnClickListener来实现。

主界面代码:

public class CheckRecyclerViewActivity extends AppCompatActivity implements CheckAdapter.CheckItemListener {
  //适配器
  private CheckAdapter mCheckAdapter;
  //列表
  private RecyclerView check_rcy;
  //全选操作
  private CheckBox check_all_cb;
  //列表数据
  private List<CheckBean> dataArray;
  //选中后的数据
  private List<CheckBean> checkedList;
  private boolean isSelectAll;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_check_recyclerview);
    checkedList = new ArrayList<>();
    initDatas();
    initViews();
  }

  private void initViews() {
    check_rcy = (RecyclerView) findViewById(R.id.check_rcy);
    check_all_cb = (CheckBox) findViewById(R.id.check_all_cb);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    check_rcy.setLayoutManager(linearLayoutManager);
    mCheckAdapter = new CheckAdapter(this, dataArray, this);
    check_rcy.setAdapter(mCheckAdapter);
    //如果使用CheckBox的OnCheckedChangeListener事件,则选中事件会有一些意想不到的结果,欢迎体验
    //在列表Item中的CheckBox也一样的效果
    check_all_cb.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        isSelectAll = !isSelectAll;
        checkedList.clear();
        if (isSelectAll) {//全选处理
          checkedList.addAll(dataArray);
        }
        for (CheckBean checkBean : dataArray) {
          checkBean.setChecked(isSelectAll);
        }
        mCheckAdapter.notifyDataSetChanged();
      }
    });
  }

  private void initDatas() {
    dataArray = new ArrayList<>();
    for (int i = 0; i < 20; i++) {
      CheckBean bean = new CheckBean();
      bean.setOrder(String.valueOf(i + 1));
      bean.setName("名称_" + i);
      bean.setContent("第" + i + "条内容");
      bean.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
      dataArray.add(bean);
    }
  }

  @Override
  public void itemChecked(CheckBean checkBean, boolean isChecked) {
    //处理Item点击选中回调事件
    if (isChecked) {
      //选中处理
      if (!checkedList.contains(checkBean)) {
        checkedList.add(checkBean);
      }
    } else {
      //未选中处理
      if (checkedList.contains(checkBean)) {
        checkedList.remove(checkBean);
      }
    }
    //判断列表数据是否全部选中
    if (checkedList.size() == dataArray.size()) {
      check_all_cb.setChecked(true);
    } else {
      check_all_cb.setChecked(false);
    }
  }
}



列表数据适配器:

public class CheckAdapter extends RecyclerView.Adapter<CheckAdapter.ViewHolder> {
  private Context mContext;
  private List<CheckBean> mDatas;
  private CheckItemListener mCheckListener;

  public CheckAdapter(Context mContext, List<CheckBean> mDatas, CheckItemListener mCheckListener) {
    this.mContext = mContext;
    this.mDatas = mDatas;
    this.mCheckListener = mCheckListener;
  }

  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.check_recyclerview_item, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
  }

  @Override
  public void onBindViewHolder(final ViewHolder holder, final int position) {
    final CheckBean bean = mDatas.get(position);
    holder.item_order_tv.setText(bean.getOrder());
    holder.item_name_tv.setText(bean.getName());
    holder.item_content_tv.setText(bean.getContent());
    holder.item_time_tv.setText(bean.getTime());
    holder.item_cb.setChecked(bean.isChecked());
    //点击实现选择功能,当然可以把点击事件放在item_cb对应的CheckBox上,只是焦点范围较小
    holder.item_content_ll.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        bean.setChecked(!bean.isChecked());
        holder.item_cb.setChecked(bean.isChecked());
        if (null != mCheckListener) {
          mCheckListener.itemChecked(bean, holder.item_cb.isChecked());
        }
        notifyDataSetChanged();
      }
    });
  }

  @Override
  public int getItemCount() {
    return mDatas.size();
  }

  public class ViewHolder extends RecyclerView.ViewHolder {
    //序号
    private TextView item_order_tv;
    //选择
    private CheckBox item_cb;
    //整个条目
    private LinearLayout item_content_ll;
    //名称
    TextView item_name_tv;
    //内容
    TextView item_content_tv;
    //时间
    private TextView item_time_tv;


    public ViewHolder(View itemView) {
      super(itemView);
      item_order_tv = (TextView) itemView.findViewById(R.id.item_order_tv);
      item_cb = (CheckBox) itemView.findViewById(R.id.item_cb);
      item_name_tv = (TextView) itemView.findViewById(R.id.item_name_tv);
      item_content_tv = (TextView) itemView.findViewById(R.id.item_content_tv);
      item_time_tv = (TextView) itemView.findViewById(R.id.item_time_tv);
      item_content_ll = (LinearLayout) itemView.findViewById(R.id.item_content_ll);
    }
  }

  public interface CheckItemListener {

    void itemChecked(CheckBean checkBean, boolean isChecked);
  }
}



测试数据实体BEAN:

public class CheckBean implements Serializable {
  private String order;
  private String name;
  private String content;
  private String time;
  private boolean isChecked;

  public String getOrder() {
    return order;
  }

  public void setOrder(String order) {
    this.order = order;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getContent() {
    return content;
  }

  public void setContent(String content) {
    this.content = content;
  }

  public String getTime() {
    return time;
  }

  public void setTime(String time) {
    this.time = time;
  }

  public boolean isChecked() {
    return isChecked;
  }

  public void setChecked(boolean checked) {
    isChecked = checked;
  }
}



主界面布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp"
    android:background="@drawable/drawable_white_round_bg"
    android:orientation="vertical">

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="20dp"
      android:orientation="horizontal">

    <TextView
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:text="序号"
        android:layout_marginLeft="10dp"
        android:textSize="12sp"
        android:textColor="#333333"
        android:gravity="center"
        />

    <CheckBox
        android:id="@+id/check_all_cb"
        android:layout_width="12dp"
        android:layout_gravity="center"
        android:button="@null"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_height="12dp"
        android:background="@drawable/drawable_cb_selector"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="名称"
        android:layout_marginLeft="10dp"
        android:textSize="12sp"
        android:textColor="#333333"
        android:gravity="center"
        />

    <TextView
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:text="内容"
        android:layout_marginLeft="10dp"
        android:textSize="12sp"
        android:textColor="#333333"
        android:gravity="center"
        />

    <TextView
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:text="时间"
        android:layout_marginLeft="10dp"
        android:textSize="12sp"
        android:textColor="#333333"
        android:gravity="center"
        />
  </LinearLayout>

  <View
      android:layout_width="match_parent"
      android:layout_height="1px"
      android:background="#bcbcbc"></View>

  <android.support.v7.widget.RecyclerView
      android:id="@+id/check_rcy"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>

</LinearLayout>

列表Item布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

  <LinearLayout
      android:id="@+id/item_content_ll"
      android:layout_width="match_parent"
      android:layout_height="40dp"
      android:orientation="horizontal">

    <TextView
        android:id="@+id/item_order_tv"
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:textSize="15sp"
        android:textColor="#333333"
        android:gravity="center"
        />

    <CheckBox
        android:id="@+id/item_cb"
        android:layout_width="20dp"
        android:layout_gravity="center"
        android:button="@null"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_height="20dp"
        android:background="@drawable/drawable_cb_selector"
        />

    <TextView
        android:id="@+id/item_name_tv"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:textSize="15sp"
        android:textColor="#333333"
        android:gravity="center"
        />

    <TextView
        android:id="@+id/item_content_tv"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:textSize="15sp"
        android:textColor="#333333"
        android:gravity="center"
        />

    <TextView
        android:id="@+id/item_time_tv"
        android:layout_width="120dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:textSize="15sp"
        android:textColor="#333333"
        android:gravity="center"
        />
  </LinearLayout>

  <View
      android:layout_width="match_parent"
      android:layout_height="1px"
      android:background="#bcbcbc"/>
</LinearLayout>

界面布局是随意写的,请根据实际情况调整。上丑图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # RecyclerView  # CheckBox  # 列表数据  # kotlin android extensions 插件实现示例详解  # 一文读懂Android Kotlin的数据流  # Android使用ViewBinding的详细步骤(Kotlin简易版)  # Android入门之使用RecyclerView完美实现瀑布流界面详解  # Android studio listview实现列表数据显示 数据循环显示效果  # Android列表组件ListView使用详解之动态加载或修改列表数据  # Android kotlin RecyclerView遍历json实现列表数据的  # 全选  # 会有  # 放在  # 最多  # 用了  # 实际情况  # 比较大  # 较小  # 好几个  # 来实现  # 达不到  # 回调  # 意想不到  # 大家多多  # 请根据  # 测试数据  # clear  # addAll  # checkBean  # view 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  网站建设要注意的标准 促进网站用户好感度!  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  制作公司内部网站有哪些,内网如何建网站?  南京网站制作费用,南京远驱官方网站?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  大连 网站制作,大连天途有线官网?  javascript中对象的定义、使用以及对象和原型链操作小结  如何在阿里云香港服务器快速搭建网站?  LinuxCD持续部署教程_自动发布与回滚机制  Android GridView 滑动条设置一直显示状态(推荐)  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  详解vue.js组件化开发实践  如何基于云服务器快速搭建网站及云盘系统?  如何在 Pandas 中基于一列条件计算另一列的分组均值  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  网站制作价目表怎么做,珍爱网婚介费用多少?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  如何在Windows虚拟主机上快速搭建网站?  Laravel怎么调用外部API_Laravel Http Client客户端使用  如何用低价快速搭建高质量网站?  如何用已有域名快速搭建网站?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel怎么为数据库表字段添加索引以优化查询  网站制作报价单模板图片,小松挖机官方网站报价?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  微信小程序 input输入框控件详解及实例(多种示例)  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在Windows 2008云服务器安全搭建网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Python文件操作最佳实践_稳定性说明【指导】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何有效防御Web建站篡改攻击?  奇安信“盘古石”团队突破 iOS 26.1 提权  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  高端建站如何打造兼具美学与转化的品牌官网?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何自定义建站之星网站的导航菜单样式?  Laravel如何记录自定义日志?(Log频道配置)  详解jQuery中基本的动画方法  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  图册素材网站设计制作软件,图册的导出方式有几种?  如何在阿里云通过域名搭建网站?