热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要为大家详细介绍了Android使用RecyclerView结合CheckBox实现列表数据选择操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这些时间做安卓盒子项目,因为安卓电视的显示器比较大,所以一个界面显示 很多数据 ,最多的时候,一个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 dataArray;
  //选中后的数据
  private List 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 {
  private Context mContext;
  private List mDatas;
  private CheckItemListener mCheckListener;

  public CheckAdapter(Context mContext, List 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;
  }
}



主界面布局文件:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  

    

    

    

    

    
  

  

  



列表Item布局:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  

    

    

    

    

    
  

  


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

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


推荐阅读
author-avatar
deniz2502915157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有