RecyclerView上放置CheckBox实现全选和单选,不选功能。
2017-06-20 15:42
585 查看
res文件下的代码:
(1)anim文件夹——listanim.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:shareInterpolator="true"> <scale android:duration="250" android:fromXScale="100%" android:fromYScale="0%" android:pivotX="0%" android:pivotY="0%" android:toXScale="100%" android:toYScale="100%" /> </set>
(2)layout—–activity_main.xml,list_item.xml
<android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/commit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="确定" />
<?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=" 4000 horizontal"> <TextView android:id="@+id/tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="?android:attr/textAppearanceLarge" /> <CheckBox android:id="@+id/cb" android:layout_width="24dp" android:layout_height="24dp" android:layout_marginRight="10dp" android:visibility="invisible" /> </LinearLayout>
(3)menu文件夹下的———main.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/all" android:title="全选" yourapp:showAsAction="always" /> <item android:id="@+id/no_all" android:title="全不选" yourapp:showAsAction="always" /> </menu>
MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private List<String> list; private ListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); findViewById(R.id.commit).setOnClickListener(this); initData(); //布局管理器 LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); recyclerView.setHasFixedSize(true); adapter = new ListAdapter(list, this); recyclerView.setAdapter(adapter); //添加分割线 recyclerView.addItemDecoration(new MyDecoration(this, MyDecoration.VERTICAL_LIST)); adapter.setRecyclerViewOnItemClickListener(new ListAdapter.RecyclerViewOnItemClickListener() { @Override public void onItemClickListener(View view, int position) { //设置选中的项 adapter.setSelectItem(position); } @Override public boolean onItemLongClickListener(View view, int position) { adapter.setShowBox(); //设置选中的项 adapter.setSelectItem(position); adapter.notifyDataSetChanged(); return true; } }); } @Override public void onClick(View v) { //获取你选中的item Map<Integer, Boolean> map = adapter.getMap(); for (int i = 0; i < map.size(); i++) { if (map.get(i)) { Log.d("TAG", "你选了第:" + i + "项"); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { //全选 case R.id.all: Map<Integer, Boolean> map = adapter.getMap(); for (int i = 0; i < map.size(); i++) { map.put(i, true); adapter.notifyDataSetChanged(); } break; //全不选 case R.id.no_all: Map<Integer, Boolean> m = adapter.getMap(); for (int i = 0; i < m.size(); i++) { m.put(i, false); adapter.notifyDataSetChanged(); } break; } return super.onOptionsItemSelected(item); } /** * 为列表添加测试数据 */ private void initData() { list=new ArrayList<>(); for (int i=0;i<100;i++) { list.add("当前条目是"+i); } } }
ListAdapter:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener { //数据源 private List<String> list; private Context context; //是否显示单选框,默认false private boolean isshowBox = true; // 存储勾选框状态的map集合 private Map<Integer, Boolean> map = new HashMap<>(); //接口实例 private RecyclerViewOnItemClickListener onItemClickListener; public ListAdapter(List<String> list, Context context) { this.list = list; this.context = context; initMap(); } //初始化map集合,默认为不选中 private void initMap() { for (int i = 0; i < list.size(); i++) { map.put(i, false); } } //视图管理 public class ViewHolder extends RecyclerView.ViewHolder { private TextView title; private CheckBox checkBox; private View root; public ViewHolder(View root) { super(root); this.root = root; title = (TextView) root.findViewById(R.id.tv); checkBox = (CheckBox) root.findViewById(R.id.cb); } } @Override public int getItemCount() { return list.size(); } //绑定视图管理者 @Override public void onBindViewHolder(ViewHolder holder, final int position) { holder.title.setText(list.get(position)); //长按显示/隐藏 if (isshowBox) { holder.checkBox.setVisibility(View.VISIBLE); } else { holder.checkBox.setVisibility(View.INVISIBLE); } Animation animation = AnimationUtils.loadAnimation(context, R.anim.list_anim); //设置checkBox显示的动画 if (isshowBox) holder.checkBox.startAnimation(animation); //设置Tag holder.root.setTag(position); //设置checkBox改变监听 holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //用map集合保存 map.put(position, isChecked); } }); // 设置CheckBox的状态 if (map.get(position) == null) { map.put(position, false); } holder.checkBox.setChecked(map.get(position)); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View root = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); ViewHolder vh = new ViewHolder(root); //为Item设置点击事件 root.setOnClickListener(this); root.setOnLongClickListener(this); return vh; } //点击事件 @Override public void onClick(View v) { if (onItemClickListener != null) { //注意这里使用getTag方法获取数据 onItemClickListener.onItemClickListener(v, (Integer) v.getTag()); } } //长按事件 @Override public boolean onLongClick(View v) { //不管显示隐藏,清空状态 initMap(); return onItemClickListener != null && onItemClickListener.onItemLongClickListener(v, (Integer) v.getTag()); } //设置点击事件 public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } //设置是否显示CheckBox public void setShowBox() { //取反 isshowBox = !isshowBox; } //点击item选中CheckBox public void setSelectItem(int position) { //对当前状态取反 if (map.get(position)) { map.put(position, false); } else { map.put(position, true); } notifyItemChanged(position); } //返回集合给MainActivity public Map<Integer, Boolean> getMap() { return map; } //接口回调设置点击事件 public interface RecyclerViewOnItemClickListener { //点击事件 void onItemClickListener(View view, int position); //长按事件 boolean onItemLongClickListener(View view, int position); } }
MyDecoration
public class MyDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private int mOrientation; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; //我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置 public static final int[] ATRRS = new int[]{android.R.attr.listDivider}; public MyDecoration(Context context, int orientation) { final TypedArray ta = context.obtainStyledAttributes(ATRRS); this.mDivider = ta.getDrawable(0); ta.recycle(); setOrientation(orientation); } //设置屏幕的方向 public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mOrientation == HORIZONTAL_LIST) { drawVerticalLine(c, parent, state); } else { drawHorizontalLine(c, parent, state); } } //画横线, 这里的parent其实是显示在屏幕显示的这部分 public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); //获得child的布局信息 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //Log.d("wnw", left + " " + top + " "+right+" "+bottom+" "+i); } } //画竖线 public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) { int top = parent.getPaddingTop(); int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); //获得child的布局信息 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } //由于Divider也有长宽高,每一个Item需要向下或者向右偏移 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (mOrientation == HORIZONTAL_LIST) { //画横线,就是往下偏移一个分割线的高度 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { //画竖线,就是往右偏移一个分割线的宽度 outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } }
Demo下载地址:https://github.com/lu3896/RecyclerView_Checkbox
相关文章推荐
- RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
- RecyclerView使用,item实现全选,反选,单选,计算checkbox选中的个数
- Android Recyclerview实现多选,单选,全选,反选,批量删除的功能
- RecyclerView嵌套CheckBox实现单选全选反选操作每条Item添加分割线
- 关于Recyclerview 实现多选,单选,全选,反选,批量删除的功能的实现
- Android利用RecyclerView实现全选、置顶和拖拽功能示例
- ListView、RecyclerView CheckBox 单选实现,以及RecyclerView异步加载网络图片
- android ListView中Checkbox实现单选,全选,全不选功能
- android实现RecyclerView列表单选功能
- Android RecyclerView Item动画(Checkbox全选、单选)
- RecyclerView单选框删除条目,全选删除,Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算
- RecyclerView实现购物车的全选、反选功能
- LitePal+RecyclerView+checkBox实现便签功能(仿小米便签)
- MVP实现用Retrofit请求网络数据Fresco加载图片,Recyclerview CheckBox显示并实现全选删除
- RecyclerView之CheckBox实现单选效果
- Android 实现RecyclerView嵌套RecyclerView 实现购物车的全选 反选 单选 商家全选
- 实现Android RecyclerView上拉加载功能
- RecyclerView 实现滑动删除和拖拽功能
- jquery 实现gridview checkbox 全选功能
- winform中DataGridView使用DataGridViewCheckBoxColumn实现RadioBox单选功能