Recyclerview+checkbox 简单的购物车效果
2017-06-19 21:10
337 查看
相信购物车大家都很熟悉,界面用到的Recyclerview加载条目,以及嵌套checkbox实现单选,多选,全选,反选效果下面给大家简单介绍一下,我在实现以上效果的时候遇到的一点小坑,checkbox选中条目滑出屏幕时丢失选中状态的现象还是老规矩,直接上代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_margin="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="全选" android:id="@+id/check_all" /> <Button android:layout_marginLeft="150dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="反选" android:id="@+id/check_reveser" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler" ></android.support.v7.widget.RecyclerView> </LinearLayout>
<?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="wrap_content"android:layout_margin="10dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="nihao "android:textAppearance="?android:attr/textAppearanceLarge" /><CheckBoxandroid:id="@+id/cb"android:layout_width="24dp"android:layout_height="24dp"android:layout_marginRight="10dp"/></LinearLayout>以上为布局文件,接下来上完整版代码
package test.bwie.com.liugang20170619;import android.content.DialogInterface;import android.os.Bundle;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.DividerItemDecoration;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;/*** @ Description:主业务操作类 RecyclerView嵌套checkbox* @ Date:2017/6/19* @ Author:刘刚*/public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button check_all;private Button check_reveser;private RecyclerView recycler;private LinearLayout activity_main;private MyAdapter adapter;SparseArray<Boolean> checkStates;// 存储勾选框状态的map集合@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initDate();}private void initView() {check_all = (Button) findViewById(R.id.check_all); //根据ID初始化控价check_reveser = (Button) findViewById(R.id.check_reveser);recycler = (RecyclerView) findViewById(R.id.recycler);activity_main = (LinearLayout) findViewById(R.id.activity_main);check_all.setOnClickListener(this); //设置checkbox监听事件check_reveser.setOnClickListener(this);adapter = new MyAdapter();recycler.setAdapter(adapter); //设置适配器recycler.setLayoutManager(new LinearLayoutManager(this)); //添加布局管理器recycler.setItemAnimator(new DefaultItemAnimator()); //添加默认动画recycler.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); //添加默认分割线//条目的点击事件和长按事件adapter.setRecyclerViewOnItemClickListener(new RecyclerViewOnItemClickListener() {@Overridepublic void onItemClickListener(View view, int position) {Toast.makeText(MainActivity.this, "这是条目"+(position+1), Toast.LENGTH_SHORT).show();}@Overridepublic boolean onItemLongClickListener(View view, final int position) {/* AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create();dialog.setMessage("这是条目"+(position+1));dialog.show();*/final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).setTitle("警示").setMessage("这是条目"+(position+1)).show();return false;}});}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.check_all:selectAll();break;case R.id.check_reveser:reverse();break;}}// 反选private void reverse() {for (int i = 0; i < checkStates.size(); i++) {if (checkStates.valueAt(i)) {checkStates.setValueAt(i, false);} else {checkStates.setValueAt(i, true);}}adapter.notifyDataSetChanged();}// 全选private void selectAll() {for (int i = 0; i < checkStates.size(); i++) {checkStates.setValueAt(i, true);}adapter.notifyDataSetChanged();}// 初始化100条数据private void initDate() {checkStates = new SparseArray<>();for (int i = 0; i < 100; i++) {checkStates.put(i, false);}}//为Recyclerview设置适配器private class MyAdapter extends RecyclerView.Adapter<MyViewHolder> implements View.OnClickListener, View.OnLongClickListener {//接口实例public RecyclerViewOnItemClickListener onItemClickListener;@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);MyViewHolder holder = new MyViewHolder(v);v.setOnClickListener(this);v.setOnLongClickListener(this);return holder;}@Overridepublic void onBindViewHolder(final MyViewHolder holder, final int position) {holder.tv.setText((position+1)+"");holder.checkBox.setText(checkStates.keyAt(position)+"");//设置Tagholder.root.setTag(position);// 用户点击checkbox行为会需要增加监听来改变checkStates对应项的状态holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Log.v("check",position+":"+isChecked);checkStates.put(position,isChecked);}});//这里为一点小坑,就是上面所说的滑屏选中状态丢失的现象,所以在checkbox的选中监听里我们需要将checkbox//的选择状态和选择条目的position记录下来,在bindviewholder中设置选中,可以完美解决
holder.checkBox.setChecked( checkStates.get(position));}@Overridepublic int getItemCount() {return checkStates.size();}@Overridepublic void onClick(View v) {if (onItemClickListener != null) {//注意这里使用getTag方法获取数据onItemClickListener.onItemClickListener(v, (Integer) v.getTag());}}//长按事件@Overridepublic boolean onLongClick(View v) {//不管显示隐藏,清空状态return onItemClickListener != null && onItemClickListener.onItemLongClickListener(v, (Integer) v.getTag());}//设置点击事件public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}}//接口回调设置点击事件public interface RecyclerViewOnItemClickListener {//点击事件void onItemClickListener(View view, int position);//长按事件boolean onItemLongClickListener(View view, int position);}private class MyViewHolder extends RecyclerView.ViewHolder{public CheckBox checkBox;public TextView tv;private View root;public MyViewHolder(View root) {super(root);this.root = root;checkBox = (CheckBox)root.findViewById(R.id.cb);tv = (TextView) root.findViewById(R.id.tv);}}}最终效果
相关文章推荐
- 简单的RecyclerView嵌套RecyclerView实现购物车效果
- RecyclerView之CheckBox实现单选效果
- [置顶] Android-RecyclerView实现购物车简单功能
- Recyclerview最最简单实现水平分页GridView效果
- RecyclerView简单解析使用Xutils实现表格效果和普通listview效果
- Android-RecyclerView实现购物车简单功能
- 使用RecyclerView 简单实现QQ好友列表展开效果
- RecyclerView和购物车的简单结合使用
- 简单的实现轮播图和RecyclerView效果
- Android长按图片多选效果(Recyclerview+Checkbox)的实现
- RecyclerView简单实现卡片叠加移除效果(模仿探探)
- Android-RecyclerView--实现一级购物车简单功能
- 简单的购物车(RecyclerView)
- RecyclerView的简单使用以及实现瀑布流效果
- RecyclerView的简单瀑布流效果
- UICollectionView实现的图片的多选效果(本人已封装好,简单操作)
- Android 自定义RecyclerView 实现真正的Gallery效果
- Android 自定义RecyclerView 实现真正的Gallery效果
- Android 自定义RecyclerView 实现真正的Gallery效果
- [iOS/Swift]简单实现跟系统一样的毛玻璃效果的View,可在上面加控件,可移动