購物車二級列表
阿新 • • 發佈:2019-01-12
做開發,直接上效果,沒有效果都是扯淡
這裡用的二級列表(ExpandableListView)用的資料是一個json解析後的資料在bean 裡面設定兩個boolean 型別的資料來改變是否選中
這裡用的是MVP 框架實現的購物車
這裡實現的功能有:child 與group 的聯動,互相監聽,全選與child.group 的互動 加減控制元件的監聽,實現選擇後實時改變商品總價,與商品總數量。
直接上程式碼
github地址:https://github.com/victorlj/Shopping-Cart
MyAdapter
package com.example.mvp_gwc.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.mvp_gwc.R; import com.example.mvp_gwc.bean.MyBean; import com.example.mvp_gwc.weight.jiajianView; import java.util.List; public class MyAdapter extends BaseExpandableListAdapter { private List<MyBean.DataBean> list; private Context context; public MyAdapter(List<MyBean.DataBean> list, Context context) { this.list = list; this.context = context; } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int groupPosition) { return list.get(groupPosition).getSpus().size(); } @Override public Object getGroup(int groupPosition) { return null; } @Override public Object getChild(int groupPosition, int childPosition) { return null; } @Override public long getGroupId(int groupPosition) { return 0; } @Override public long getChildId(int groupPosition, int childPosition) { return 0; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { groupHolder groupHolder; if(convertView ==null){ convertView =View.inflate(context, R.layout.expenr_group,null); groupHolder = new groupHolder(); groupHolder.group_ck=convertView.findViewById(R.id.group_ck); groupHolder.group_title=convertView.findViewById(R.id.group_title); convertView.setTag(groupHolder); }else{ groupHolder = (MyAdapter.groupHolder) convertView.getTag(); } groupHolder.group_ck.setChecked(list.get(groupPosition).isGroupischeck()); groupHolder.group_title.setText(list.get(groupPosition).getName()); // group 中group_ck的點選事件 groupHolder.group_ck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (adaptercallback!=null){ adaptercallback.groupchecked(groupPosition); } } }); return convertView; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { childHolder childHolder; if(convertView ==null){ convertView =View.inflate(context, R.layout.expenr_child,null); childHolder = new childHolder(); childHolder.child_ck=convertView.findViewById(R.id.child_ck); childHolder.child_title=convertView.findViewById(R.id.child_title); childHolder.child_img=convertView.findViewById(R.id.child_img); childHolder.child_price=convertView.findViewById(R.id.child_price); childHolder.jiajianView =convertView.findViewById(R.id.jiajian); convertView.setTag(childHolder); }else{ childHolder = (MyAdapter.childHolder) convertView.getTag(); } childHolder.child_ck.setChecked(list.get(groupPosition).getSpus().get(childPosition).isChildischeck()); childHolder.child_title.setText(list.get(groupPosition).getSpus().get(childPosition).getName()); childHolder.child_price.setText(list.get(groupPosition).getSpus().get(childPosition).getSkus().get(0).getPrice()+""); Glide.with(convertView).load(list.get(groupPosition).getSpus().get(childPosition).getPic_url()).into(childHolder.child_img); childHolder.jiajianView.setNum(list.get(groupPosition).getSpus().get(childPosition).getPraise_num()); // childHolder 中child.ck 的點選事件 childHolder.child_ck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(adaptercallback!=null){ adaptercallback.childchecked(groupPosition,childPosition); } } }); // childHolder中jiajianView 的監聽事件 childHolder.jiajianView.setjiajian(new jiajianView.jiajiancallback() { @Override public void setjiajian(int mnum) { list.get(groupPosition).getSpus().get(childPosition).setPraise_num(mnum); if(adaptercallback!=null){ adaptercallback.jiajian(); } } }); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } class groupHolder{ CheckBox group_ck; TextView group_title; } class childHolder{ CheckBox child_ck; TextView child_title; TextView child_price; ImageView child_img; jiajianView jiajianView; } // 檢視group 中所有child的狀態 public boolean lookgroupchecked(int groupposition){ for (int i = 0; i <list.get(groupposition).getSpus().size(); i++) { if(!list.get(groupposition).getSpus().get(i).isChildischeck()){ return false; } } return true; } // 根據檢視group 的狀態然後改變child 的狀態和group 的狀態 public void groupallchecked(int groupposition,boolean b){ list.get(groupposition).setGroupischeck(b); for (int i = 0; i <list.get(groupposition).getSpus().size(); i++) { list.get(groupposition).getSpus().get(i).setChildischeck(b); } } // 檢視child 的狀態 public boolean lookchildchecked(int groupposition,int childposition){ boolean b = list.get(groupposition).getSpus().get(childposition).isChildischeck(); return b; } // 改變child 的狀態 然後 檢視group 的狀態最後改變group 的狀態, public void childckecked(int groupposition,int childposition,boolean b){ list.get(groupposition).getSpus().get(childposition).setChildischeck(b); boolean b1 = lookgroupchecked(groupposition); if(b1){ list.get(groupposition).setGroupischeck(b1); }else{ list.get(groupposition).setGroupischeck(b1); } } // 檢視是否全部選中 public boolean lookallchecked(){ for (int i = 0; i <list.size(); i++) { if(!lookgroupchecked(i)){ return false; } } return true; } // 改變全選與全不選 public void setallchecked(boolean b){ for (int i = 0; i <list.size(); i++) { groupallchecked(i,b); } } @Override public boolean areAllItemsEnabled() { return super.areAllItemsEnabled(); } // 自定義介面 public interface Adaptercallback{ // group 的監聽事件 void groupchecked(int groupposition); // child的監聽事件 void childchecked(int groupposition,int childposition); // 加減的監聽事件 void jiajian(); } private Adaptercallback adaptercallback; public void setcallback(Adaptercallback adaptercallback){ this.adaptercallback =adaptercallback; } }
MainActivity
package com.example.mvp_gwc; import android.view.View; import android.widget.CheckBox; import android.widget.ExpandableListView; import android.widget.TextView; import android.widget.Toast; import com.example.mvp_gwc.adapter.MyAdapter; import com.example.mvp_gwc.base.BaseActivity; import com.example.mvp_gwc.bean.MyBean; import com.example.mvp_gwc.ivew.IVew; import com.example.mvp_gwc.pressent.PressentImpl; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class MainActivity extends BaseActivity implements IVew { private CheckBox main_ck_qx; private TextView allprice; private TextView allnum; private ExpandableListView expend; private PressentImpl pressent; private List<MyBean.DataBean> list = new ArrayList<>(); private String murl = "http://www.wanandroid.com/tools/mockapi/6523/restaurant-list"; private MyAdapter adapter; @Override protected int getLayout() { return R.layout.activity_main; } @Override protected void getfindbyid() { main_ck_qx = findViewById(R.id.main_ck_qx); allprice = findViewById(R.id.allprice); allnum = findViewById(R.id.allnum); expend = findViewById(R.id.expend); adapter = new MyAdapter(list, this); expend.setAdapter(adapter); expend.setGroupIndicator(null); adapter.setcallback(new MyAdapter.Adaptercallback() { @Override public void groupchecked(int groupposition) { boolean b = adapter.lookgroupchecked(groupposition); adapter.groupallchecked(groupposition, !b); boolean b1 = adapter.lookallchecked(); if (b1) { main_ck_qx.setChecked(b1); } else { main_ck_qx.setChecked(b1); } getallprice(); getallnumber(); adapter.notifyDataSetChanged(); } @Override public void childchecked(int groupposition, int childposition) { boolean b = adapter.lookchildchecked(groupposition, childposition); adapter.childckecked(groupposition, childposition, !b); boolean b1 = adapter.lookallchecked(); if (b1) { main_ck_qx.setChecked(b1); } else { main_ck_qx.setChecked(b1); } getallprice(); getallnumber(); adapter.notifyDataSetChanged(); } @Override public void jiajian() { getallprice(); getallnumber(); } }); } @Override protected void setonclicked() { main_ck_qx.setOnClickListener(this); } @Override protected void prasce() { pressent = new PressentImpl(this); pressent.getdata(murl); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.main_ck_qx: boolean b = adapter.lookallchecked(); main_ck_qx.setChecked(!b); adapter.setallchecked(!b); getallprice(); getallnumber(); adapter.notifyDataSetChanged(); break; } } @Override public void success(Object success) { list.addAll((Collection<? extends MyBean.DataBean>) success); getallprice(); getallnumber(); adapter.notifyDataSetChanged(); // 第一次載入就展開所有的子類 for (int i = 0; i <list.size(); i++) { expend.expandGroup(i); } // 不能點選收縮 expend.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { return true; } }); } @Override public void error(String error) { Toast.makeText(this, error, Toast.LENGTH_SHORT).show(); } public void getallprice() { double number = 0.0; for (int i = 0; i < list.size(); i++) { for (int j = 0; j < list.get(i).getSpus().size(); j++) { if (list.get(i).getSpus().get(j).isChildischeck()) { number += list.get(i).getSpus().get(j).getPraise_num() * list.get(i).getSpus().get(j).getSkus().get(0).getPrice(); } } } allprice.setText("商品總價:" + number + ""); } public void getallnumber() { int number = 0; for (int i = 0; i < list.size(); i++) { for (int j = 0; j < list.get(i).getSpus().size(); j++) { if (list.get(i).getSpus().get(j).isChildischeck()) { number += list.get(i).getSpus().get(j).getPraise_num(); } } } allnum.setText("商品總數量:" + number + ""); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:id="@+id/lin" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal"> <CheckBox android:id="@+id/main_ck_qx" android:text="全選" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/allprice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_horizontal" android:text="商品總價:" /> <TextView android:id="@+id/allnum" android:text="商品總數量:" android:gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> <ExpandableListView android:id="@+id/expend" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/lin"></ExpandableListView> </RelativeLayout>
自定義控制元件jiajianView
package com.example.mvp_gwc.weight;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.mvp_gwc.R;
public class jiajianView extends LinearLayout implements View.OnClickListener {
private TextView jian;
private TextView ed;
private TextView jia;
private int mnum;
public jiajianView(Context context, AttributeSet attrs) {
super(context, attrs);
LinearLayout.inflate(context, R.layout.add_jian, this);
init();
}
public void setNum(int num){
this.mnum =num;
ed.setText(num+"");
}
private void init() {
jian =findViewById(R.id.jian);
jia =findViewById(R.id.jia);
jia.setOnClickListener(this);
jian.setOnClickListener(this);
ed =findViewById(R.id.ed);
}
private jiajiancallback jiajiancallback;
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.jia:
mnum++;
ed.setText(mnum+"");
if(jiajiancallback!=null){
jiajiancallback.setjiajian(mnum);
}
break;
case R.id.jian:
if(mnum>0){
mnum--;
ed.setText(mnum+"");
if(jiajiancallback!=null){
jiajiancallback.setjiajian(mnum);
}
}else{
Toast.makeText(getContext(), "最小為0", Toast.LENGTH_SHORT).show();
}
break;
}
}
public interface jiajiancallback{
void setjiajian(int mnum);
}
public void setjiajian(jiajiancallback jiajiancallback){
this.jiajiancallback =jiajiancallback;
}
}