栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 list; 
private List 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(); 
} 
}); 
} 
 
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 { 
private List list; 
public recyclerAdapter(List 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 { 
private List cbeanList, cbeanList1; 
public recyclerAdapter1(List 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 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 getList() { 
return list; 
} 
public void setList(List 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

 
 
 
 
 
 
 
 

shop_item.xml:

 
 
 
 
 
 
 
 
 
 
 

check_item:

 
 
 
 
 

简单的效果图:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/160477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号