Android中实现淘宝购物车RecyclerView或LIstView的嵌套选择的逻辑

使用了RecyclerView嵌套RecyclerView的方案。

购物车的第一个界面为RecyclerView,每个Item里面包含一个店铺。在Item中使用RecyclerView包含店铺和店铺的多个商品。

实现思路:

使用接口回调将第二个adapter的商品选择的监听事件回调给第一个adapter后再在第一个adapter中回调给MainActivity。

使用接口回调将第一个adapter的商品选择的监听事件回调给MainActivity。

在MainActivity中处理第一个adapter和第二个adapter的事件监听。

MainActivity:

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private CheckBox checkBox;
private recyclerAdapter adapter;
private RecyclerView.LayoutManager manager;
private List<bean> list;
private List<cbean> cbeanList,cbeanListcp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
checkBox = (CheckBox) findViewById(R.id.shop_checkbox);
list = new ArrayList<>();
//第一个店铺的数据
cbeanList = new ArrayList<>();
cbean c = new cbean();
c.setText("商品");
c.setIscheck(false);
cbean c1 = new cbean();
c1.setText("商品1");
c1.setIscheck(false);
cbeanList.add(c);
cbeanList.add(c1);
bean b = new bean();
b.setIscheck(false);
b.setText("店名");
b.setList(cbeanList);
//第二个店铺的数据
cbeanListcp = new ArrayList<>();
cbean c2 = new cbean();
c2.setText("商品2");
c2.setIscheck(false);
cbean c3 = new cbean();
c3.setText("商品3");
c3.setIscheck(false);
cbeanListcp.add(c2);
cbeanListcp.add(c3);
bean b1 = new bean();
b1.setIscheck(false);
b1.setText("店名1");
b1.setList(cbeanListcp);
//不能添加有重复变量的数据
list.add(b);
list.add(b1);
manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
//优化性能
recyclerView.setHasFixedSize(true);
adapter = new recyclerAdapter(list);
recyclerView.setAdapter(adapter);
//全选CheckBox监听
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
for (int i = 0;i < list.size();i++){
//选择店铺
if (!list.get(i).ischeck()){
list.get(i).setIscheck(true);
}
for (int j = 0;j < list.get(i).getList().size();j++){
//选择店铺的商品
if (!list.get(i).getList().get(j).ischeck()){
list.get(i).getList().get(j).setIscheck(true);
}
}
}
}else {
//只有当点击全不选时才执行
// 解决点击取消选择店铺或商品时,
// 全选按钮取消选择状态,不会不变成全不选
if (allSelect() == list.size()){
for (int i = 0;i < list.size();i++){
if (list.get(i).ischeck()){
list.get(i).setIscheck(false);
}
for (int j = 0;j < list.get(i).getList().size();j++){
if (list.get(i).getList().get(j).ischeck()){
list.get(i).getList().get(j).setIscheck(false);
}
}
}
}
}
//更新
UpdateRecyclerView();
}
});
adapter.setCallBack(new recyclerAdapter.allCheck() {
@Override
public void OnCheckListener(boolean isSelected, int position) {
//保存店铺点击状态
list.get(position).setIscheck(isSelected);
//通知全选CheckBox的选择状态
if (allSelect() == list.size()){
checkBox.setChecked(true);
}else {
checkBox.setChecked(false);
}
if (isSelected){
for (int i = 0;i < list.get(position).getList().size();i++){
if (!list.get(position).getList().get(i).ischeck()){
list.get(position).getList().get(i).setIscheck(true);
}
}
}else {
// 解决点击取消选择商品时,
// 店铺全选按钮取消选择状态,不会不变成全不选
if (allChildSelect(position) == list.get(position).getList().size()){
for (int i = 0;i < list.get(position).getList().size();i++){
if (list.get(position).getList().get(i).ischeck()){
list.get(position).getList().get(i).setIscheck(false);
}
}
}
}
//更新
UpdateRecyclerView();
}
@Override
public void OnItemCheckListener(boolean isSelected, int parentposition, int chaildposition) {
//保存商品点击状态
list.get(parentposition).getList().get(chaildposition).setIscheck(isSelected);
//通知店铺选择的状态
if (allChildSelect(parentposition) == list.get(parentposition).getList().size()){
list.get(parentposition).setIscheck(true);
}else {
list.get(parentposition).setIscheck(false);
}
UpdateRecyclerView();
}
});
}
/*
*解决Recycleyview刷新报错问题
*/
private void UpdateRecyclerView() {
Handler handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
};
handler.post(r);
}
//计算店铺的选择数量
private int allSelect(){
int sum = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).ischeck()){
sum++;
}
}
System.out.println(sum);
return sum;
}
//计算每个店铺商品的选择数量
private int allChildSelect(int position){
int sum = 0;
for (int i = 0; i < list.get(position).getList().size(); i++) {
if (list.get(position).getList().get(i).ischeck()){
sum++;
System.out.println(position+":"+i+":"+list.get(position).getList().get(i).ischeck());
}
}
return sum;
}
} 

第一个Adapter:

public class recyclerAdapter extends RecyclerView.Adapter<recyclerAdapter.MyHolder> {
private List<bean> list;
public recyclerAdapter(List<bean> list){
this.list = list;
} 

public static class MyHolder extends RecyclerView.ViewHolder{
private RecyclerView recyclerView;
private TextView textView;
private CheckBox checkBox;
private recyclerAdapter1 adapter;
private RecyclerView.LayoutManager manager;
public CheckBox getCheckBox() {
return checkBox;
}
public RecyclerView getRecyclerView() {
return recyclerView;
}
public TextView getTextView() {
return textView;
}
public MyHolder(View itemView) {
super(itemView);
recyclerView = (RecyclerView) itemView.findViewById(R.id.list_items);
textView = (TextView) itemView.findViewById(R.id.tv_name);
checkBox = (CheckBox) itemView.findViewById(R.id.checkbox0);
manager = new LinearLayoutManager(itemView.getContext());
recyclerView.setLayoutManager(manager);
}
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item,null);
MyHolder holder = new MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final MyHolder holder, final int position) {
holder.adapter = new recyclerAdapter1(list.get(position).getList());
holder.recyclerView.setAdapter(holder.adapter);
holder.getTextView().setText(list.get(position).getText());
holder.getCheckBox().setChecked(list.get(position).ischeck());
holder.getCheckBox().setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//将店铺的checkbox的点击变化事件进行回调
if (mCallBack!=null){
mCallBack.OnCheckListener(isChecked,position);
}
}
});
//实现第二层RecyclerView的回调接口
holder.adapter.setCallBack(new recyclerAdapter1.allCheck() {
@Override
public void OnCheckListener(boolean isChecked, int childpostion) {
//将店铺商品的checkbox的点击变化事件进行回调
if (mCallBack!=null){
mCallBack.OnItemCheckListener(isChecked,position,childpostion);
}
}
});
holder.itemView.setTag(list.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
private allCheck mCallBack;
public void setCallBack(allCheck callBack) {
mCallBack = callBack;
}
public interface allCheck{
//回调函数 将店铺的checkbox的点击变化事件进行回调
public void OnCheckListener(boolean isSelected,int position);
//回调函数 将店铺商品的checkbox的点击变化事件进行回调
public void OnItemCheckListener(boolean isSelected,int parentposition,int chaildposition);
}
} 

第二个Adapter:

public class recyclerAdapter1 extends RecyclerView.Adapter<recyclerAdapter1.MyHolder> {
private List<cbean> cbeanList, cbeanList1;
public recyclerAdapter1(List<cbean> cbeanList) {
this.cbeanList = cbeanList;
cbeanList1 = cbeanList;
}
public static class MyHolder extends RecyclerView.ViewHolder {
private TextView textView;
private CheckBox checkBox; 

public TextView getTextView() {
return textView;
}
public CheckBox getCheckBox() {
return checkBox;
}
public MyHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.checkbox_tv);
checkBox = (CheckBox) itemView.findViewById(R.id.checkbox1);
}
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.check_item, null);
MyHolder holder = new MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final MyHolder holder, final int position) {
holder.getTextView().setText(cbeanList.get(position).getText());
holder.getCheckBox().setChecked(cbeanList.get(position).ischeck());
holder.getCheckBox().setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//将商品的checkbox的点击变化事件进行回调给第一个Recyclerview
if (mCallBack != null) {
mCallBack.OnCheckListener(isChecked, position);
}
}
});
holder.itemView.setId(position);
}
@Override
public int getItemCount() {
return cbeanList.size();
}
private allCheck mCallBack;
public void setCallBack(allCheck callBack) {
mCallBack = callBack;
}
public interface allCheck {
//回调函数 将店铺商品的checkbox的点击变化事件进行回调
public void OnCheckListener(boolean isChecked, int childpostion);
}
}

实体类保存数据和选择状态:

public class bean {
private boolean ischeck;
private String text;
private List<cbean> list;
public boolean ischeck() {
return ischeck;
}
public void setIscheck(boolean ischeck) {
this.ischeck = ischeck;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public List<cbean> getList() {
return list;
}
public void setList(List<cbean> list) {
this.list = list;
}
}
public class cbean {
private boolean ischeck;
private String text;
public boolean ischeck() {
return ischeck;
}
public void setIscheck(boolean ischeck) {
this.ischeck = ischeck;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}

布局文件:activity_main.xml

<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.cuboo.myapplication.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</android.support.v7.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/shop_checkbox"
android:layout_marginLeft="12dp"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="left|center"
android:padding="12dp"
android:gravity="center" />
</LinearLayout>
</LinearLayout> 

shop_item.xml:

<?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="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox0"
android:layout_width="24dp"
android:layout_height="24dp" />
<TextView
android:id="@+id/tv_name"
android:text="店名"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/colorAccent"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_items"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
<View
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@color/colorAccent"/>
</LinearLayout> 

check_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp">
<CheckBox
android:layout_gravity="center"
android:id="@+id/checkbox1"
android:layout_width="24dp"
android:layout_height="24dp" />
<TextView
android:id="@+id/checkbox_tv"
android:text="222"
android:layout_weight="1"
android:layout_gravity="center"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout> 

简单的效果图:

以上所述是小编给大家介绍的Android中实现淘宝购物车RecyclerView或LIstView的嵌套选择的逻辑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android实现的仿淘宝购物车demo示例

    本文实例讲述了Android实现的仿淘宝购物车.分享给大家供大家参考,具体如下: 夏的热情渐渐退去,秋如期而至,丰收的季节,小编继续着实习之路,走着走着,就走到了购物车,逛过淘宝或者是京东的小伙伴都知道购物车里面的宝贝可不止一件,对于爱购物的姑娘来说,购物车里面的商品恐怕是爆满,添加不进去了,以前逛淘宝的时候,小编没有想过要怎么样实现购物车,就知道在哪儿一个劲儿的逛,但是现在不一样了,小编做为一个开发者,想的就是该如何实现,捣鼓了两天的时间,用listview来实现,已经有模有样了,现在小编就来

  • Android实现购物车及其他功能的角标

    1.先来张效果图 2.自定义一个角标工具类BottomBarView . ** * Created by Administrator on 2016/12/27. * 角标工具类 */ public class BottomBarView extends RelativeLayout { private Context context; private TextView bar_num; private int count = 0; public BottomBarView(Context co

  • Android仿外卖购物车功能

    先看看效果图: 知识点分析 效果图来看不复杂内容并没多少,值得介绍一下的知识点也就下面几个吧 - 列表标题悬停 - 左右列表滑动时联动 - 添加商品时的抛物线动画 - 底部弹出购物车清单 - 数据的同步 另外就是实现效果的时候可能会遇到的几个坑... 布局很简单直接进入代码 1:列表标题悬停 现在做项目列表什么的基本抛弃了ListView改用RecyclerView,上篇博客中的标题悬停也是使用了一个RecyclerView的开源项目sticky-headers-recyclerview,不过写

  • Android实现二级列表购物车功能

    本文实例为大家分享了Android实现二级列表购物车功能的具体代码,供大家参考,具体内容如下 MainActivity: package com.baway.twoshopcar; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.CheckBox; import android.widget.Expa

  • Android仿饿了么加入购物车旋转控件自带闪转腾挪动画的按钮效果(实例详解)

    概述 在上文,酷炫Path动画已经预告了,今天给大家带来的是利用 纯自定义View,实现的仿饿了么加入购物车控件,自带闪转腾挪动画的按钮. 效果图如下: 图1 项目中使用的效果,考虑到了View的回收复用, 并且可以看到在RecyclerView中使用,切换LayoutManager也是没有问题的, 图2 Demo效果,测试各种属性值 注意,本控件非继承自ViewGroup,而是纯自定义View实现.理由如下: 1 减少布局层级,从而提高性能 2 文字和图形纯draw,用到什么draw什么,没有

  • Android制作简单的普通购物车

    本文实例为大家分享了Android普通购物车制作过程,供大家参考,具体内容如下 1.最新项目新增了类似购物车功能,如下图所示: 当时刚看到此页面的时候,第一反应是利用 ListView嵌套Listview,经过一番操作最终也实现了此功能.当时也没有考虑性能问题,只考虑能写出来.后来嵌套数据,当数据量较大时,滑动Listview可以明显感觉到卡顿,这对用户来说是很难忍受的,所以才有了找到替代方案的想法,看到网上主流的是用ExpandableListView来实现此功能,所以我也用此方案来写一下.

  • Android实现购物车添加物品的动画效果

    前言:当我们写商城类的项目的时候,一般都会有加入购物车的功能,加入购物车的时候会有一些抛物线动画,最近做到这个功能,借助别人的demo写了一个. 效果: 开发环境:AndroidStudio2.1.2+gradle-2.10 涉及知识:1.沉浸式状态栏,2.单位精度计算(价格),3.List之Iterator. 部分代码: public class MainActivity extends AppCompatActivity implements FoodAdapter.FoodActionCa

  • Android实现购物车功能

    最近看了一些淘宝购物车的demo,于是也写了一个. 效果图如下: 主要代码如下: actvity中的代码: public class ShoppingCartActivity extends BaseActivity { private List<Test> data; private ListView mListView; private ShoppingCartAdapter adapter; private RelativeLayout rlRefresh; private TextVi

  • Android把商品添加到购物车的动画效果(贝塞尔曲线)

    当我们写商城类的项目的时候,一般都会有加入购物车的功能,加入购物车的时候会有一些抛物线动画,具体代码如下: 实现效果如图: 思路: 确定动画的起终点 在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹 设置属性动画,ValueAnimator插值器,获取中间点的坐标 将执行动画的控件的x.y坐标设为上面得到的中间点坐标 开启属性动画 当动画结束时的操作 难点: PathMeasure的使用 - getLength() - boolean getPosTan(float distance, f

  • Android实现仿淘宝购物车增加和减少商品数量功能demo示例

    本文实例讲述了Android实现仿淘宝购物车增加和减少商品数量功能.分享给大家供大家参考,具体如下: 在前面一篇<Android实现的仿淘宝购物车demo示例>中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了,本来想买一件来着,小手不小心抖了一下,把数量错点成了三个,这个时候就涉及到一个新的功能,那就是增加和减少商品的数量,今天这篇博文,小编就来和小伙伴们

随机推荐