天天看點

二級購物車邏輯(RecycleView嵌套RecycleView)

邏輯:

全選全不選

商品控制商家

商家控制商品複選框

商家和商品控制全選

複選框選中狀态計算價格

第一步:

封裝bean對象,在商家和商品的bean對象内添加boolean變量

提供set ,get方法

fragment頁面或activity頁面:

public class Shouye extends Fragment implements Showinterface.Showview, View.OnClickListener {
private Handler handler = new Handler();
private RecyclerView recyclerView;
private CheckBox quan;
private Myadapter myadapter;
private List<Showdata1.DataBean> data1;
private TextView jiage;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.shouye, container, false);
    recyclerView = view.findViewById(R.id.recy);
    quan = view.findViewById(R.id.quan);
    //全選的點選事件
    quan.setOnClickListener(this);
    jiage = view.findViewById(R.id.jiage);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    Showpresentre showpresentre = new Showpresentre();
    showpresentre.attchview(this);
    showpresentre.getda();

    return view;
}


//傳回的資料
 @Override
 public void Showview(final String data) {

 handler.post(new Runnable() {//開主線程
        @Override
        public void run() {
            Gson gson = new Gson();
            Showdata1 showdata = gson.fromJson(data, Showdata1.class);
            data1 = showdata.getData();
            myadapter = new Myadapter(data1, getActivity());
            recyclerView.setAdapter(myadapter);
            shangjia();
        }
    });
}

private void shangjia() {//商家控制全選
    myadapter.setGroupListener(new Myadapter.onGroupListener() {
        @Override
        public void onGroup(List<Showdata1.DataBean> data1) {
            int price = 0; //這是一個價格
            int num1 = 0;//商品得數量
            int num2 = 0;//商品選中數量
            for (int i = 0; i < data1.size(); i++) {
                List<Showdata1.DataBean.ListBean> list = data1.get(i).getList();
                for (int j = 0; j < list.size(); j++) {   //商品
                    num1++; //商品數量++
                    boolean ischecked = list.get(j).isIschecked();//商品的狀态
                    if (ischecked) {//如果 商品的狀态為  true的話
                        num2++;  //就把商品選中的數量  ++
                        //計算選中商品的價格
                        price += data1.get(i).getList().get(j).getNum() * data1.get(i).getList().get(j).getPrice();
                    }
                }
            }
            //在循壞外面判斷 如果商品的數量==選中商品的數量
            if (num1 == num2) {
                quan.setChecked(true);//把全選的checkbox 設定為true
            } else {       //把全選的checkbox 設定為false
                quan.setChecked(false);
            }
            //設定價格
            jiage.setText(price + "");
        }
    });
}

//全選 /反選的點選事件
@Override
public void onClick(View view) {

    setOntListChick(quan.isChecked());
}

//全選 /反選
private void setOntListChick(boolean checked) {
    int prices = 0;//價格
    if (checked) {//如果 全選checkbox為 true的話
        for (int i = 0; i < data1.size(); i++) {  //就把  商家 循環  便利
            data1.get(i).setIschecked(true);//    設為true
            for (int j = 0; j < data1.get(i).getList().size(); j++) {//商品 循環  便利
                //商品也設為 true
                data1.get(i).getList().get(j).setIschecked(true);
                // //如果  商品為true的true的話計算價格
                prices += data1.get(i).getList().get(j).getNum() * data1.get(i).getList().get(j).getPrice();
            }
        }

    } else {//  如果   全選的CheckBox為false的話
        for (int i = 0; i < data1.size(); i++) {//周遊商家
            //周遊商家 設為 false
            data1.get(i).setIschecked(false);
            for (int j = 0; j < data1.get(i).getList().size(); j++) {
                //周遊商品 設為 false
                data1.get(i).getList().get(j).setIschecked(false);
            }
        }

    }
    //重新整理擴充卡
    myadapter.notifyDataSetChanged();
    //這邊是給價格 指派
    jiage.setText(prices + "");
}}
           

商家的擴充卡:

public class Myadapter extends RecyclerView.Adapter<Myadapter.Viewholder> {
List<Showdata1.DataBean> data1;
Context context;

public Myadapter(List<Showdata1.DataBean> data1, Context context) {
    this.data1 = data1;
    this.context = context;
}

@NonNull
@Override
public Myadapter.Viewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(context).inflate(R.layout.iteam, viewGroup, false);
    return new Viewholder(view);
}

@Override
public void onBindViewHolder(@NonNull final Myadapter.Viewholder viewholder, final int i) {
    viewholder.shang.setText(data1.get(i).getSellerName());
    viewholder.shang1.setChecked(data1.get(i).isIschecked());
    viewholder.recyclerView.setLayoutManager(new LinearLayoutManager(context));
    final List<Showdata1.DataBean.ListBean> list = data1.get(i).getList();
    final Shngpinadapter shngpinadapter = new Shngpinadapter(list, context);
    viewholder.recyclerView.setAdapter(shngpinadapter);

    //商品   擴充卡的監聽
    shngpinadapter.setChildListener(new Shngpinadapter.onChildListener() {
        @Override
        public void onChild() {
            if (groupListener != null) {
                groupListener.onGroup(data1);
            }
            //聲明  變量  為 true
            boolean ischecked = true;
            //周遊 商品 資訊
            for (int j = 0; j < list.size(); j++) {
                boolean ischecked1 = list.get(j).isIschecked();//擷取商品的狀态
                if (!ischecked1) {//商品沒有選中的話
                    ischecked = false; //把剛剛定義的變量設為false
                    break;
                }
            }
            //通過商品狀态 來改變商家狀态
            viewholder.shang1.setChecked(ischecked);
            //通過商品狀态 來改變商家狀态
            data1.get(i).setIschecked(ischecked);


        }
    });
    //商家控制 商品   shang1是   商家的checkbox
    //給商家設定點選事件
    viewholder.shang1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // 改變商家的狀态
            viewholder.shang1.setChecked(viewholder.shang1.isChecked());
            // 改變商品的狀态  調用 商品擴充卡内的  setCheckChild()方法
            shngpinadapter.setCheckChild(viewholder.shang1.isChecked());
        }
    });

}

@Override
public int getItemCount() {

    return data1.size();
}


public class Viewholder extends RecyclerView.ViewHolder {

    private final TextView shang;
    private final RecyclerView recyclerView;
    private final CheckBox shang1;

    public Viewholder(@NonNull View itemView) {
        super(itemView);
        shang = itemView.findViewById(R.id.shang);
        recyclerView = itemView.findViewById(R.id.recy1);
        shang1 = itemView.findViewById(R.id.scheckbox);
    }
}

public interface onGroupListener {
    void onGroup(List<Showdata1.DataBean> data1);
}

public onGroupListener groupListener;

public void setGroupListener(onGroupListener groupListener) {
    this.groupListener = groupListener;
}}
           

商品的擴充卡:

public class Shngpinadapter extends RecyclerView.Adapter<Shngpinadapter.Viewholder> {
List<Showdata1.DataBean.ListBean> list;
Context context;


public Shngpinadapter(List<Showdata1.DataBean.ListBean> list, Context context) {
    this.list = list;
    this.context = context;
}

@NonNull
@Override
public Shngpinadapter.Viewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(context).inflate(R.layout.siteam, viewGroup, false);
    return new Viewholder(view);


}

@Override
public void onBindViewHolder(@NonNull final Shngpinadapter.Viewholder viewholder, final int i) {
    viewholder.name.setText(list.get(i).getTitle());
    viewholder.price.setText(list.get(i).getPrice() + "");
    viewholder.checkBox.setChecked(list.get(i).isIschecked());
    Glide.with(context).load(list.get(i).getImages()).into(viewholder.imageView);
    //自定義view;
    viewholder.myview.setData(this, list, i);
    viewholder.myview.setNumChangeListener(new Myview.onNumChangeListener() {
        @Override
        public void onResult() {
            if (childListener != null) {
                childListener.onChild();
            }
        }
    });
    //商品狀态  改變
    viewholder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (childListener != null) {
                list.get(i).setIschecked(b); //b或  true   或   false  因為在 onchengchenckdechangelisnenert
                childListener.onChild();
            }
        }

    });


}

//設定商品的狀态
public void setCheckChild(boolean checked) {
    //商家擴充卡調用次方法
    //通過該方法實作商家内部商品全選
    for (int i = 0; i < list.size(); i++) {
        list.get(i).setIschecked(checked);
    }
    //設定完狀态  重新整理擴充卡
    notifyDataSetChanged();
}


@Override
public int getItemCount() {
    return list.size();
}

public class Viewholder extends RecyclerView.ViewHolder {

    private final TextView name;
    private final TextView price;
    private final ImageView imageView;
    private final CheckBox checkBox;
    private final Myview myview;

    public Viewholder(@NonNull View itemView) {
        super(itemView);
        name = itemView.findViewById(R.id.sname);
        price = itemView.findViewById(R.id.sprice);
        imageView = itemView.findViewById(R.id.simage);
        checkBox = itemView.findViewById(R.id.pchenckbox);
        myview = itemView.findViewById(R.id.myview);
    }
}

public interface onChildListener {
    void onChild();
}

public onChildListener childListener;

public void setChildListener(onChildListener childListener) {
    this.childListener = childListener;
}}
           

自定義View加減器

public class Myview extends LinearLayout implements View.OnClickListener {

private EditText ed;
private int numbre;  //自定義一個numbre
private List<Showdata1.DataBean.ListBean> list;
private Shngpinadapter childAdapter;
private int i;
Context context;


public Myview(Context context) {
    super(context);
}

public Myview(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    initview(context);
}


public Myview(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

private void initview(Context context) {
    View view = LayoutInflater.from(context).inflate(R.layout.myview2, null, false);
    addView(view);
    view.findViewById(R.id.jia).setOnClickListener(this);
    view.findViewById(R.id.jian).setOnClickListener(this);
    ed = view.findViewById(R.id.ed1);

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.jia:  //加
            numbre++;    //numbre++;
            ed.setText(numbre + ""); // 給設定值
            list.get(i).setNum(numbre); //給   商品裡面的num,設定新++過後的值
            if (numChangeListener != null) {
                numChangeListener.onResult();
            }
            childAdapter.notifyDataSetChanged();//重新整理 商品


            break;
        case R.id.jian:    //減
            numbre--;   //numbre--
            if (numbre < 1) {  //   numbre小于 1的時候
                Toast.makeText(context, "不能再減了", Toast.LENGTH_SHORT).show();
                numbre = 1;
            } else {
                ed.setText(numbre + "");
                list.get(i).setNum(numbre);
                numChangeListener.onResult();
                childAdapter.notifyDataSetChanged();
            }

            break;

    }
}

//商品擴充卡調用的方法
public void setData(Shngpinadapter childAdapter, List<Showdata1.DataBean.ListBean> list, int i) {
    this.childAdapter = childAdapter;
    this.list = list;
    this.i = i;
    numbre = list.get(i).getNum();
    ed.setText(list.get(i).getNum() + "");
}


public interface onNumChangeListener {
    void onResult();
}

public onNumChangeListener numChangeListener;

public void setNumChangeListener(onNumChangeListener numChangeListener) {
    this.numChangeListener = numChangeListener;
}}
           

效果:

二級購物車邏輯(RecycleView嵌套RecycleView)
二級購物車邏輯(RecycleView嵌套RecycleView)
二級購物車邏輯(RecycleView嵌套RecycleView)
上一篇: 二級購物車

繼續閱讀