先展示一波效果圖(如下)
功能效果:當點擊店鋪的CheckBox時候,選中此店鋪中的所有商品,當點擊底部全選框,選中所有店鋪和其中的商品,底部價格和數量隨著選中商品的數量改變而改變,

第一步:初始化布局頁面、資料
布局使用的是兩個RecyclerView嵌套,一個是店鋪,一個是商品,底部全選框,價格和數量的文本框,在activity中分別初始化
1、在購物車bean類(商品資料下)中加入標識,并設定Getter和Setter方法
//解決checkBox位置錯亂
private boolean isCheck;
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean check) {
isCheck = check;
}
2、創建購物車資料為泛型的ArrayList集合,用于存放資料
List<ShoppingCartBean.OrderDataBean> list = new ArrayList<>();
3、存放資料,以及recyclerView設定布局管理器
//集合添加資料
list.addAll(((ShoppingCartBean) o).getOrderData());
adapter = new MyAdapter(list, MyApplication.context);
//設定配接器
recyclerView.setAdapter(adapter);
//設定布局管理器 此處為全域背景關系
recyclerView.setLayoutManager(new LinearLayoutManager(MyApplication.context));
4、自定義控制元件 加減器(我直接定義了三個TextView分別作為“+”,“商品數量,”“-”)
//設定數量(子配接器呼叫)
public void setCountText(int counts) {
countText.setText(counts+"");
}
//加減器介面回呼
public interface Numberinter{
void setNumber(int number);
}
private Numberinter numberinter;
public void setNumberinter(Numberinter numberinter) {
this.numberinter = numberinter;
}
//設定加減器點擊事件
@OnClick({R.id.add_text, R.id.remove_text})
public void onViewClicked(View view) {
int number= Integer.parseInt(countText.getText().toString());
switch (view.getId()) {
case R.id.add_text:
number++;
countText.setText(number+"");
if (numberinter!=null){
numberinter.setNumber(number);
}
break;
case R.id.remove_text:
if (number>=2){
number--;
countText.setText(number+"");
if (numberinter!=null){
numberinter.setNumber(number);
}
}else {
Toast.makeText(getContext(), "已經是最小數了", Toast.LENGTH_SHORT).show();
}
break;
}
}
第二步:配接器
同樣有兩個RecyclerView配接器,一個父配接器(店鋪),一個子配接器(商品),子配接器直接以內部類的形式存放在父配接器中
1、介面回呼
//設定介面回呼 Activity中呼叫
public interface MyInter {
//點擊商家的checkbox
void setGroupClick(int Index);
//點擊商品的checkbox
void setClick(int Index, int childIndex);
//點擊加減器
void setAddClick(int Index, int childIndex, int number);
}
private MyInter myInter;
public void setMyInter(MyInter myInter) {
this.myInter = myInter;
}
2、父配接器的 onBindViewHolder
//設定店鋪名
holder.groupName.setText(list.get(position).getShopName());
//店鋪商品設定布局管理
holder.childRecy.setLayoutManager(new LinearLayoutManager(context));
//給串列設定子配接器(第一個引數為資料集合,第二個引數為所點擊的位置在子配接器中為Index)
ChilAdapter chilAdapter=new ChilAdapter(list.get(position).getCartlist(),position);
holder.childRecy.setAdapter(chilAdapter);
//設定店鋪選框點擊事件
holder.groupCheckbox.setChecked(setGroupChecked(position));
holder.groupCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//介面回呼
if (myInter!=null){
myInter.setGroupClick(position);
}
}
});
3、子配接器
3.1、父配接器傳過來的引數進行有參構造
private List<ShoppingCartBean.OrderDataBean.CartlistBean> list;
//傳過來所點擊的坐標
private int Index;
public ChilAdapter(List<ShoppingCartBean.OrderDataBean.CartlistBean> list, int index) {
this.list = list;
Index = index;
}
3.2、子配接器onBindViewHolder
//給商品條目設定資料
holder.chileImage.setImageURI(list.get(position).getDefaultPic());
holder.commodityName.setText(list.get(position).getProductName()+"");
holder.commodityPrice.setText(list.get(position).getPrice()+"");
//設定選框是否選中
holder.childCheckBox.setChecked(list.get(position).isCheck());
//設定商品數量(呼叫自定義加減器中方法)
holder.jiajian.setCountText(list.get(position).getCount());
//checkbox設定點擊監聽事件
holder.childCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (myInter!=null){
myInter.setClick(Index,position);
}
}
});
//設定加減器改變商品數量
holder.jiajian.setNumberinter(new AddAndroidRemove.Numberinter() {
@Override
public void setNumber(int number) {
if (myInter!=null){
myInter.setAddClick(Index,position,number);
}
}
});
3.3、店鋪選框
//判斷店鋪groupCheckebox是否選中
public boolean setGroupChecked(int Index){
boolean b=true;
List<ShoppingCartBean.OrderDataBean.CartlistBean> cartlist=list.get(Index).getCartlist();
for (int i=0;i<cartlist.size();i++){
ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean=cartlist.get(i);
if (!cartlistBean.isCheck()){
b=false;
break;
}
}
return b;
}
//點擊店鋪選框groupCheckebox
public void setGroupCheck(int index,boolean b){
List<ShoppingCartBean.OrderDataBean.CartlistBean> cartlist=list.get(index).getCartlist();
for (int i=0;i<cartlist.size();i++){
cartlist.get(i).setCheck(b);
}
}
3.4、商品選框
//判斷商品有沒有被選中
public boolean ChildCheck(int Index,int childIndex){
return list.get(Index).getCartlist().get(childIndex).isCheck();
}
//點擊商品選框
public void setChildCheck(int Index,int childIndex,boolean b){
list.get(Index).getCartlist().get(childIndex).setCheck(b);
}
3.5、底部全選框
//判斷全選(判斷所有產品是否都被選中)
public boolean isAllCheck(){
boolean b=true;
for (int i=0;i<list.size();i++){
for (int j=0;j<list.get(i).getCartlist().size();j++){
ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
=list.get(i).getCartlist().get(j);
if (!cartlistBean.isCheck()){
b=false;
break;
}
}
}
return b;
}
//全部選中
public void setAllCheck(boolean b){
for (int i=0;i<list.size();i++){
for (int j=0;j<list.get(i).getCartlist().size();j++){
ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
=list.get(i).getCartlist().get(j);
cartlistBean.setCheck(b);
}
}
}
3.6、計算總價和數量
//計算價格
public int getAllprice(){
int number=0;
for (int i=0;i<list.size();i++){
for (int j=0;j<list.get(i).getCartlist().size();j++){
ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
=list.get(i).getCartlist().get(j);
if (cartlistBean.isCheck()){
number+=cartlistBean.getPrice()*cartlistBean.getCount();
}
}
}
return number;
}
//所有商品數量
public int getAllcount(){
int number=0;
for (int i=0;i<list.size();i++){
for (int j=0;j<list.get(i).getCartlist().size();j++){
ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
=list.get(i).getCartlist().get(j);
if (cartlistBean.isCheck()){
number+=cartlistBean.getCount();
}
}
}
return number;
}
第三步:Activity呼叫配接器(這一步比較簡單,都是直接呼叫配接器中的方法)
1、點擊全選以及自動計算價格和數量(上面初始化Adapter,以下為直接呼叫)
//點擊全選事件
@OnClick(R.id.all_check)
public void onViewClicked() {
boolean checkAll=adapter.isAllCheck();
adapter.setAllCheck(!checkAll);
//重繪狀態
adapter.notifyDataSetChanged();
//計價
caush();
}
public void check(){
boolean checkAll=adapter.isAllCheck();
allCheck.setChecked(checkAll);
}
//計算總價
public void caush(){
allCount.setText(adapter.getAllcount()+"");
allPrice.setText(adapter.getAllprice()+"");
}
2、店鋪、商品和價格、數量的聯動
//店鋪選框
adapter.setMyInter(new MyAdapter.MyInter() {
@Override
public void setGroupClick(int Index) {
boolean b = adapter.setGroupChecked(Index);
adapter.setGroupCheck(Index, !b);
adapter.notifyDataSetChanged();
//全選
check();
//計價
caush();
}
//商品選框
@Override
public void setClick(int Index, int childIndex) {
boolean c = adapter.ChildCheck(Index, childIndex);
adapter.setChildCheck(Index, childIndex, !c);
adapter.notifyDataSetChanged();
//全選
check();
//計價
caush();
}
//加減器
@Override
public void setAddClick(int Index, int childIndex, int number) {
list.get(Index).getCartlist().get(childIndex).setCount(number);
//計價
caush();
}
});
此功能主要由介面回呼實作,最重要的一個細節就是在Bean類中添加標識,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/162845.html
標籤:其他
