邏輯:
全選全不選
商品控制商家
商家控制商品複選框
商家和商品控制全選
複選框選中狀态計算價格
第一步:
封裝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;
}}
效果: