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

 更新时间:2016年12月02日 17:21:51   作者:dingcheng998  
这篇文章主要介绍了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的嵌套选择的逻辑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Kotlin协程Channel特点及使用细节详解

    Kotlin协程Channel特点及使用细节详解

    这篇文章主要为大家介绍了Kotlin协程Channel特点及使用细节详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Android 避免APP启动闪黑屏的解决办法(Theme和Style)

    Android 避免APP启动闪黑屏的解决办法(Theme和Style)

    闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和onResume才会显示界面
    2013-07-07
  • Android自定义ViewGroup之FlowLayout(三)

    Android自定义ViewGroup之FlowLayout(三)

    这篇文章主要为大家详细介绍了Android自定义ViewGroup之FlowLayout,常用于关键字标签,搜索热词列表等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android自定义引导玩转ViewPager的方法详解

    Android自定义引导玩转ViewPager的方法详解

    这篇文章主要给大家介绍了关于Android自定义引导玩转ViewPager的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Android实现调用系统分享功能示例的总结

    Android实现调用系统分享功能示例的总结

    这篇文章主要介绍了通过Android调用系统分享文本信息、单张图片、多个文件和指定分享到微信、QQ,同时分享图片和文字的功能示例,小编觉得挺不错,一起跟随小编过来看看吧
    2018-05-05
  • Android 百度地图POI搜索功能实例代码

    Android 百度地图POI搜索功能实例代码

    POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。通过本文给大家介绍Android 百度地图POI搜索功能实例代码,需要的朋友参考下
    2016-02-02
  • 从源码剖析Android中的Intent组件

    从源码剖析Android中的Intent组件

    这篇文章主要介绍了Android中的Intent组件,作者从源码剖析了Intent如何实现组件间的切换,需要的朋友可以参考下
    2016-03-03
  • 安卓实现自定义圆形取色盘

    安卓实现自定义圆形取色盘

    这篇文章主要介绍了安卓实现自定义圆形取色盘的相关资料,并且给出了相应的代码,推荐给大家,需要的朋友可以参考下
    2022-08-08
  • Android 使用ViewPager自动滚动循环轮播效果

    Android 使用ViewPager自动滚动循环轮播效果

    本文主要给大家介绍viewpager自动播放,循环滚动的效果,对android viewpager滚动相关知识感兴趣的朋友可以参考下本篇文章
    2015-11-11
  • Android自定义ScrollView使用自定义监听

    Android自定义ScrollView使用自定义监听

    这篇文章主要介绍了Android自定义ScrollView使用自定义监听 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12

最新评论