Android仿京東購物車-----完整程式碼(三)
阿新 • • 發佈:2019-01-30
activity
public class MainActivity extends AppCompatActivity implements View.OnClickListener { ExpandableListView expandableListView; Context context; private CheckBox checkall; private TextView allpay; private TextView allprice; private TextView allnum; private MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = MainActivity.this; initView(); initData(); } private void initView() { expandableListView = findViewById(R.id.main_expand); checkall = findViewById(R.id.main_check); allnum = findViewById(R.id.main_numb); allprice = findViewById(R.id.main_price); allpay = findViewById(R.id.main_pay); checkall.setOnClickListener(this); } private void initData() { String url = "https://www.zhaoapi.cn/product/getCarts?uid=71"; new OkHttpClient.Builder().build().newCall(new Request.Builder().url(url).build()).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(final Call call, Response response) throws IOException { final String responses = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { //解析資料 Gson gson = new Gson(); MyBean myBean = gson.fromJson(responses, MyBean.class); List<MyBean.DataBean> data = myBean.getData(); myAdapter = new MyAdapter(context, data); expandableListView.setAdapter(myAdapter); //把所有二級列表進行展開 for (int i = 0; i < data.size(); i++) { expandableListView.expandGroup(i); } //介面卡的介面回撥 myAdapter.setOnChangeLinsenter(new MyAdapter.OnChangeLinsenter() { @Override public void shopChange(int i) { boolean shop = myAdapter.isShop(i); myAdapter.shopall(i, !shop); myAdapter.notifyDataSetChanged(); refreshall(); } @Override public void goodChange(int i, int i1) { myAdapter.goodselect(i, i1); myAdapter.notifyDataSetChanged(); refreshall(); } @Override public void goodnumChange(int i, int i1, int num) { myAdapter.numshange(i, i1, num); myAdapter.notifyDataSetChanged(); refreshall(); } }); } }); } }); } @Override public void onClick(View view) { switch (view.getId()) { //全選按鈕的點選事件 case R.id.main_check: //呼叫介面卡的方法狀態 並賦值 boolean allChecked = myAdapter.isAllChecked(); myAdapter.changeAll(!allChecked); //重新整理介面卡 myAdapter.notifyDataSetChanged(); //調取重新整理全選的方法 refreshall(); break; } } //寫一個方法 專門去進行 全選 所有數量 以及總價 private void refreshall() { boolean allChecked = myAdapter.isAllChecked(); checkall.setChecked(allChecked); double allprie = myAdapter.allPrice(); allprice.setText("總價為:¥" + allprie); int snum = myAdapter.allNum(); allnum.setText("共" + snum + "件商品"); } }
adapter
/** * 介面卡中 * 展示頁面 * 做一些邏輯判斷(通過介面回撥) */ public class MyAdapter extends BaseExpandableListAdapter { List<MyBean.DataBean> data; Context context; public MyAdapter(Context context, List<MyBean.DataBean> data) { this.context = context; this.data = data; } @Override public int getGroupCount() { return data.size(); } @Override public int getChildrenCount(int i) { return data.get(i).getList().size(); } @Override public Object getGroup(int i) { return null; } @Override public Object getChild(int i, int i1) { return null; } @Override public long getGroupId(int i) { return 0; } @Override public long getChildId(int i, int i1) { return 0; } @Override public boolean hasStableIds() { return false; } //設定外層-----商家 @Override public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { //定義Holder GroupViewHolder groupViewHolder = null; if (view == null) { groupViewHolder = new GroupViewHolder(); view = View.inflate(context, R.layout.grouplayout, null); groupViewHolder.group_checkBox = view.findViewById(R.id.group_check); groupViewHolder.group_textView = view.findViewById(R.id.group_name); view.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) view.getTag(); } //賦值商家名稱 groupViewHolder.group_textView.setText(data.get(i).getSellerName()); //得到那個方法的狀態並賦值給介面卡的狀態 boolean shop = isShop(i); groupViewHolder.group_checkBox.setChecked(shop); /** * 通過點選事件 返回出介面 */ groupViewHolder.group_checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (onChangeLinsenter != null) { onChangeLinsenter.shopChange(i); } } }); return view; } //判斷商家的選中狀態 進行判斷 public boolean isShop(int i) { //遍歷子條目 判斷下面的商家狀態 List<MyBean.DataBean.ListBean> list = data.get(i).getList(); for (int j = 0; j < list.size(); j++) { if (list.get(j).getSelected() == 0) { return false; } } return true; } //設定子層-----商品 @Override public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) { ChildViewHolder childViewHolder = null; if (view == null) { childViewHolder = new ChildViewHolder(); view = View.inflate(context, R.layout.childlayout, null); childViewHolder.child_checkBox = view.findViewById(R.id.child_check); childViewHolder.child_image = view.findViewById(R.id.child_image); childViewHolder.child_name = view.findViewById(R.id.child_name); childViewHolder.child_price = view.findViewById(R.id.child_price); childViewHolder.myView = view.findViewById(R.id.child_myview); view.setTag(childViewHolder); } else { childViewHolder = (ChildViewHolder) view.getTag(); } childViewHolder.child_name.setText(data.get(i).getList().get(i1).getTitle()); double price = data.get(i).getList().get(i1).getPrice(); String prices = String.valueOf(price); childViewHolder.child_price.setText("¥" + prices); String images = data.get(i).getList().get(i1).getImages(); if (images.contains("|")) { String[] split = images.split("\\|"); Picasso.with(context).load(split[0]).into(childViewHolder.child_image); } else { Picasso.with(context).load(images).into(childViewHolder.child_image); } //獲取商品的判斷狀態並返回出去 List<MyBean.DataBean.ListBean> list = data.get(i).getList(); childViewHolder.child_checkBox.setChecked(list.get(i1).getSelected() == 1); childViewHolder.child_checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onChangeLinsenter.goodChange(i, i1); } }); //這是 介面回撥中的 數量照片 childViewHolder.myView.setOnNumChange(new MyView.onNumChange() { @Override public void onNumberChange(int number) { onChangeLinsenter.goodnumChange(i, i1, number); } }); return view; } //在介面回撥後商家使用的方法 public void shopall(int i, boolean b) { List<MyBean.DataBean.ListBean> list = data.get(i).getList(); for (int j = 0; j < list.size(); j++) { list.get(j).setSelected(b ? 1 : 0); } } //在介面回撥後商品使用的方法 public void goodselect(int i, int i1) { MyBean.DataBean.ListBean listBean = data.get(i).getList().get(i1); listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0); } //在介面回撥後數量改變使用的方法 public void numshange(int i, int i1, int number) { MyBean.DataBean.ListBean listBean = data.get(i).getList().get(i1); listBean.setNum(number); } //得到所有商品數量的方法 public int allNum() { int numa = 0; for (int i = 0; i < data.size(); i++) { List<MyBean.DataBean.ListBean> list = data.get(i).getList(); for (int j = 0; j < list.size(); j++) { if (list.get(j).getSelected() == 1) { int num = list.get(j).getNum(); numa += num; } } } return numa; } //得到所有價格的方法 public double allPrice() { double allpro = 0; for (int i = 0; i < data.size(); i++) { List<MyBean.DataBean.ListBean> list = data.get(i).getList(); for (int j = 0; j < list.size(); j++) { if (list.get(j).getSelected() == 1) { double price = list.get(j).getPrice(); int num = list.get(j).getNum(); allpro += price * num; } } } return allpro; } //判斷全選按鈕並設定對應的處理的方法 public boolean isAllChecked() { for (int i = 0; i < data.size(); i++) { List<MyBean.DataBean.ListBean> list = data.get(i).getList(); for (int j = 0; j < list.size(); j++) { if (list.get(j).getSelected() == 0) { return false; } } } return true; } //全域性全選按鈕狀態改變之後調取的方法 public void changeAll(boolean b) { for (int i = 0; i < data.size(); i++) { List<MyBean.DataBean.ListBean> list = data.get(i).getList(); for (int j = 0; j < list.size(); j++) { list.get(j).setSelected(b ? 1 : 0); } } } @Override public boolean isChildSelectable(int i, int i1) { return false; } //設定外層ViewHolder public static class GroupViewHolder { CheckBox group_checkBox; TextView group_textView; } //設定子層ViewHolder public static class ChildViewHolder { CheckBox child_checkBox; TextView child_name, child_price; ImageView child_image; MyView myView; } OnChangeLinsenter onChangeLinsenter; //設定對外層開放的方法 用於調取介面 public void setOnChangeLinsenter(OnChangeLinsenter onChangeLinsenter) { this.onChangeLinsenter = onChangeLinsenter; } //設定介面 控制商家商品數量 public interface OnChangeLinsenter { void shopChange(int i); void goodChange(int i, int i1); void goodnumChange(int i, int i1, int num); } }
自定義檢視
//自定義加減器按鈕 public class MyView extends LinearLayout implements View.OnClickListener { TextView tv_sub_view; TextView tv_number_view; TextView tv_add_view; private int number = 1; public int getNumber() { return number; } public void setNumber(int number) { this.number = number; tv_number_view.setText(number + ""); } public MyView(Context context) { this(context, null); } public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); View inflate = LayoutInflater.from(context).inflate(R.layout.myviewlayout, this); tv_sub_view = inflate.findViewById(R.id.dec); tv_number_view = inflate.findViewById(R.id.num); tv_add_view = inflate.findViewById(R.id.add); //設定點選事件 tv_sub_view.setOnClickListener(this); tv_add_view.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.dec: if (number > 1) { --number; tv_number_view.setText(number + ""); if (onNumChange != null) { onNumChange.onNumberChange(number); } } else { Toast.makeText(getContext(), "不能小於1", Toast.LENGTH_SHORT).show(); } break; case R.id.add: ++number; tv_number_view.setText(number + ""); if (onNumChange != null) { onNumChange.onNumberChange(number); } break; } } onNumChange onNumChange; public void setOnNumChange(MyView.onNumChange onNumChange) { this.onNumChange = onNumChange; } public interface onNumChange { void onNumberChange(int number); } }
自定義view佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="80dp"
android:layout_height="30dp"
android:background="#000"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="2dp">
<TextView
android:id="@+id/dec"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#fff"
android:gravity="center"
android:text="-" />
<TextView
android:id="@+id/num"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#fff"
android:gravity="center"
android:text="1" />
<TextView
android:id="@+id/add"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#fff"
android:gravity="center"
android:text="+" />
</LinearLayout>