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

这些时间做安卓盒子项目,因为安卓电视的显示器比较大,所以一个界面显示 很多数据 ,最多的时候,一个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>

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

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

(0)

相关推荐

  • Android RecyclerView使用方法详解

    本文为大家分享了Android RecyclerView使用方法,供大家参考,具体内容如下 1.RecyclerView 是在Android support - v7 里面提供的 新的列表组件,用来替代传统的ListView. . 要使用RecyclerView 需要给我工程添加 support:recycle-v7 的支持: app 右键 - Open Module Settings - Dependencies(依赖项) - 点 + 号 - 添加一个库 upport:recycle-v7 

  • RecyclerView的简单使用

    RecyclerView的功能很强大,本文为大家分享RecyclerView的简单使用方法. 效果图: activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertica

  • android使用ItemDecoration给RecyclerView 添加水印

    前言 项目中有使用到水印效果,如下图所示.在实现过程中,最终选用ItemDecoration来实现,其中有两大步骤:自定义Drawable来完成水印图片.使用ItemDecoration来布局水印. Demo在 WatermarkFragment 中,效果图如下: 1. 自定义Drawable完成水印图片 public class MyDrawable extends Drawable { Paint mPaint; public MyDrawable() { mPaint = new Pain

  • Android使用Recyclerview实现图片水平自动循环滚动效果

    简介: 本篇博客主要介绍的是如何使用RecyclerView实现图片水平方向自动循环(跑马灯效果) 效果图:  思路: 1.准备m张图片 1.使用Recyclerview实现,返回无数个(实际Interge.MAXVALUE)item,第n个item显示第n%m张图片 3.使用recyclerview.scrollBy  每个一段时间水平滚动一段距离 4.通过layoutManager.findFirstVisibleItemPosition()获取当前显示的第一个View是第几个item,上面

  • Android RecyclerView基本使用详解

    什么是RecyclerView 关于RecyclerView,是一个主要用于展示和回收View的有一个控件,在官用了一句话来概括 RecyclerView 是一种通过提供有限的数据项窗口有效显示大数据集的视图. 基提供几个基本的功能, 控制其显示的方式 --->LayoutManager-(必需) 控制Item间的间隔 --->ItemDecoration--(非必需) 控制Item增删的动画--->ItemAnimator--(非必需) 以上就可以完成ListView大部的功能了,但是

  • Android使用分类型RecyclerView仿各大商城首页

    **正所谓,一入商城深似海~ 商城类的App,确实是有许多东西值得学习,但是只要略微斟酌一下,你又会发现,它们之间存在着许多不谋而合的相似,也就是所谓的雷同~既然如此,让我们也来接下地气,先从一个简单的首页做起吧~** 实现的效果如下图: 1.大布局就是一个简单的RecyclerView: 也可以通过添加多个header实现 4.这里我仅以四种类型为例 /** * 4种类型 */ /** * 类型1:黑色星期五--使用banner实现 */ public static final int BLA

  • Android使用RecyclerView实现今日头条频道管理功能

    使用过今日头条的伙计们对这个效果肯定很熟悉.拖拽可排序,点击标签后可以删除.今天我们采用RecyclerView来实现. 实现思路: 通过ItemTouchHelper来绑定RecyclerView的子控件触摸事件. 当滑动拖拽的时候,通知适配器来交换两个子控件的显示位置. 更改数据源,使数据源与子空间显示内容一致. 这就是实现的基本思路,是不是很简单?当然,首先要了解一下ItemTouchHelper这哥们儿是干啥的,有什么作用. This is a utility class to add

  • Android RecyclerView的简单使用

    本文实例为大家分享了Android RecyclerView使用的具体代码,供大家参考,具体内容如下 package com.itheima74.recyclerview; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.Rec

  • Android如何使用RecyclerView打造首页轮播图

    先看看效果图: 停在中间自动翻页 序言:最近接到一个任务,做一个类似上面自动翻页的功能.可以看到,这一屏中有三张图片显示出来了,有两张没有显示完全,看到设计图的时候第一反应是可以用viewpager来实现,但是任务却跟你开了一个天大的玩笑,要求是以最左边的图片为基准,也就是说,左边的图片也得显示完全,就像下图所示,后来仔细想想viewpager好像没有这样的功能,也有可能是我不知道,我也没有找到这样的文章或者信息,希望知道的简友私戳交流一下,感激不尽,好了,言归正传 停在左边 在开始之前呢,首先

  • Android ExpandableRecyclerView使用方法详解

    本文为大家分享了Android ExpandableRecyclerView的使用,供大家参考,具体内容如下 1.目前只支持两级结构. 2.支持所有组同时全部展开,支持同一时间只能展开一组. 3.GroupView,ChildView高度自定义. 4.支持初始化数据时,指定展开某组数据. 5.支持GroupItem,ChildItem的Onlick,OnLongClick事件. 6.展开收起带动画. 效果图: 使用步骤:加入依赖 compile 'com.drawthink:expandable

随机推荐