購物車一個Adaper,可以刪除,全選反選,數量加減
阿新 • • 發佈:2018-12-21
1activity_main.xml頁面佈局
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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=".activity.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/text_jiesuan" /> <CheckBox android:id="@+id/query" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@id/recycle_view" app:layout_constraintBottom_toBottomOf="parent" /> <TextView android:id="@+id/text_query" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintLeft_toRightOf="@id/query" app:layout_constraintBottom_toBottomOf="@id/query" app:layout_constraintTop_toTopOf="@id/query" android:textSize="20sp" android:text="全選/反選" /> <TextView android:id="@+id/text_total" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/recycle_view" app:layout_constraintLeft_toRightOf="@id/text_query" android:layout_marginLeft="10dp" android:text="總價:¥0元" android:textColor="#f00" android:textSize="18sp" /> <TextView android:id="@+id/text_shopp" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/text_total" app:layout_constraintLeft_toRightOf="@id/text_query" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginLeft="10dp" android:text="共0件商品" android:textSize="18sp" /> <TextView android:id="@+id/text_jiesuan" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/recycle_view" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" android:text="去結算" android:textSize="26sp" android:background="@drawable/button_shape" android:gravity="center" /> </android.support.constraint.ConstraintLayout>
2自定義加減器佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageButton android:id="@+id/jian" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/ic_jian_name" /> <EditText android:id="@+id/ed_num" android:layout_width="50dp" android:layout_height="50dp" android:text="1" android:textSize="24sp" android:inputType="number" android:background="@drawable/edit_shape" /> <ImageButton android:id="@+id/add" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/ic_add_name" /> </LinearLayout>
3.子條目佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="15dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:id="@+id/shop_check" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:id="@+id/shopp_commodity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="shopp_commodity" android:textSize="24sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" > <CheckBox android:id="@+id/item_check" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/item_image" android:layout_width="120dp" android:layout_height="120dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:orientation="vertical" android:layout_weight="1" > <TextView android:id="@+id/item_name" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:textSize="18sp" android:text="name" android:maxLines="2" /> <TextView android:id="@+id/item_price" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:textSize="18sp" android:text="price" android:textColor="#f00" /> <com.example.shoppingcart01.custom.CustomView android:id="@+id/custom" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> <ImageView android:id="@+id/item_del" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginRight="10dp" android:src="@drawable/ic_del_name" /> </LinearLayout> </LinearLayout>
4.兩個shape頁面
4.1加減器shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp"/>
<solid android:color="#fff"/>
<size android:height="45dp" android:width="45dp"/>
</shape>
4.2button的shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="200dp"/>
<solid android:color="#0ff"/>
<size android:width="130dp" android:height="60dp"/>
</shape>
5.Bean類 裡面需要自己寫三個屬性程式碼中有註釋
package com.example.shoppingcart01.bean;
import java.util.List;
public class ShoppBean {
private String msg;
private String code;
private List<DataBean> data;
private final String SUCCESS_CODE="0";
public boolean isSuccess(){
return code.equals(SUCCESS_CODE);
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
private String sellerName;
private String sellerid;
private List<ListBean> list;
public String getSellerName() {
return sellerName;
}
public void setSellerName(String sellerName) {
this.sellerName = sellerName;
}
public String getSellerid() {
return sellerid;
}
public void setSellerid(String sellerid) {
this.sellerid = sellerid;
}
public List<ListBean> getList() {
return list;
}
public void setList(List<ListBean> list) {
this.list = list;
}
public static class ListBean {
private double bargainPrice;
private String createtime;
private String detailUrl;
private String images;
private int num;
private int pid;
private double price;
private int pscid;
private int selected;
private int sellerid;
private String subhead;
private String title;
//1為顯示商鋪, 2為隱藏商鋪
private int isFirst = 1;
//每個商品的選中狀態
private boolean item_check;
//商店的選中狀態
private boolean shop_check;
public int getIsFirst() {
return isFirst;
}
public void setIsFirst(int isFirst) {
this.isFirst = isFirst;
}
public boolean isItem_check() {
return item_check;
}
public void setItem_check(boolean item_check) {
this.item_check = item_check;
}
public boolean isShop_check() {
return shop_check;
}
public void setShop_check(boolean shop_check) {
this.shop_check = shop_check;
}
public double getBargainPrice() {
return bargainPrice;
}
public void setBargainPrice(double bargainPrice) {
this.bargainPrice = bargainPrice;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public String getDetailUrl() {
return detailUrl;
}
public void setDetailUrl(String detailUrl) {
this.detailUrl = detailUrl;
}
public String getImages() {
return images;
}
public void setImages(String images) {
this.images = images;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getPscid() {
return pscid;
}
public void setPscid(int pscid) {
this.pscid = pscid;
}
public int getSelected() {
return selected;
}
public void setSelected(int selected) {
this.selected = selected;
}
public int getSellerid() {
return sellerid;
}
public void setSellerid(int sellerid) {
this.sellerid = sellerid;
}
public String getSubhead() {
return subhead;
}
public void setSubhead(String subhead) {
this.subhead = subhead;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
}
}
6.自定義加減器的view
package com.example.shoppingcart01.custom;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.example.shoppingcart01.R;
public class CustomView extends LinearLayout {
private ImageButton jian;
private ImageButton add;
private EditText editText;
private int mCount = 1;
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
View view = View.inflate(context,R.layout.custom_item,this);
jian = view.findViewById(R.id.jian);
add = view.findViewById(R.id.add);
editText = view.findViewById(R.id.ed_num);
//減
jian.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String content = editText.getText().toString().trim();
Integer count = Integer.valueOf(content);
if(count>1){
mCount = count-1;
editText.setText(mCount+"");
//回撥給adapter裡面
if(customListener!=null){
customListener.jianjian(mCount);
}
}
}
});
//加
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String content = editText.getText().toString().trim();
Integer count = Integer.valueOf(content)+1;
mCount = count;
editText.setText(mCount+"");
//回撥給adapter裡面
if(customListener!=null){
customListener.jianjian(mCount);
}
}
});
//輸入框
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//TODO
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
private CustomListener customListener;
public void setCustomListener(CustomListener customListener){
this.customListener = customListener;
}
//定義介面加減
public interface CustomListener{
void jianjian(int count);
void shuruzhi(int count);
}
//這個方法共adaper設定數量時呼叫
public void setEditText(int num){
if(editText!=null){
editText.setText(num+"");
}
}
}
7.介面卡頁面(這裡操作的任務比較多)
package com.example.shoppingcart01.adaper;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.shoppingcart01.R;
import com.example.shoppingcart01.bean.ShoppBean;
import com.example.shoppingcart01.custom.CustomView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Handler;
public class ShopAdaper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<ShoppBean.DataBean.ListBean> list;
//存放商家id和商家名稱的map集合
private Map<String,String> map = new HashMap<>();
public ShopAdaper(Context mContext) {
this.mContext = mContext;
}
/**
* 新增資料並更新顯示
* */
public void add(ShoppBean shoppBean){
//傳進來的是bean物件
if(list == null){
list = new ArrayList<>();
}
//第一層遍歷商家和商品
for(ShoppBean.DataBean bean:shoppBean.getData()){
//把商品的id和商品的名稱新增到map集合裡 ,,為了之後方便呼叫
map.put(bean.getSellerid(),bean.getSellerName());
//第二層遍歷裡面的商品
for(int i = 0;i<bean.getList().size();i++){
//新增到list集合裡
list.add(bean.getList().get(i));
}
}
//呼叫方法 設定顯示或隱藏 商鋪名
setFirst(list);
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.shopp_item,viewGroup,false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
/**
* 設定商鋪的 shop_checkbox和商鋪的名字 顯示或隱藏
* */
final MyViewHolder holder = (MyViewHolder) viewHolder;
if(list.get(i).getIsFirst() == 1){
//顯示商家
holder.shop_check.setVisibility(View.VISIBLE);
holder.shopp_commodity.setVisibility(View.VISIBLE);
//設定選中狀態
holder.shop_check.setChecked(list.get(i).isShop_check());
holder.shopp_commodity.setText(map.get(String.valueOf(list.get(i).getSellerid())));
}else{
//隱藏
holder.shop_check.setVisibility(View.GONE);
holder.shopp_commodity.setVisibility(View.GONE);
}
//拆分images欄位
String[] str = list.get(i).getImages().split("\\|");
//設定商品的圖片
Glide.with(mContext).load(str[0]).into(holder.item_image);
//控制商品的checkbox,根據欄位改變
holder.item_check.setChecked(list.get(i).isItem_check());
holder.item_name.setText(list.get(i).getTitle());
holder.item_price.setText(list.get(i).getPrice()+"");
//呼叫customview裡的方法設定加減號中間的數字
holder.custom.setEditText(list.get(i).getNum());
//商鋪的shop_checkbox點選事件 ,控制商品的item_checkbox
holder.shop_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先改變資料來源中的shop_check
list.get(i).setShop_check(holder.shop_check.isChecked());
for(int a = 0;a<list.size();a++){
//如果是同一家商鋪的 都給成相同狀態
if(list.get(i).getSellerid() == list.get(a).getSellerid()){
//當前條目的選中狀態 設定成 當前商鋪的選中狀態
list.get(a).setItem_check(holder.shop_check.isChecked());
}
}
//重新整理介面卡
notifyDataSetChanged();
//呼叫求和的方法
sum(list);
}
});
//商品的item_checkbox點選事件,控制商鋪的shop_checkbox
holder.item_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先改變資料來源中的item_checkbox
list.get(i).setItem_check(holder.item_check.isChecked());
//反向控制商鋪的shop_checkbox
for(int s = 0;s<list.size();s++){
for(int j = 0;j<list.size();j++){
//如果兩個商品是同一家店鋪的 並且 這兩個商品的item_checkbox選中狀態不一樣
if(list.get(s).getSellerid() == list.get(j).getSellerid()&&!list.get(j).isItem_check()){
//就把商鋪的shop_checkbox改成false
list.get(s).setShop_check(false);
break;
}else{
//同一家商鋪的商品 選中狀態都一樣,就把商鋪shop_checkbox狀態改成true
list.get(s).setShop_check(true);
}
}
}
//更新介面卡
notifyDataSetChanged();
//呼叫求和的方法
sum(list);
}
});
//刪除條目的點選事件
holder.item_del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//移除集合中的當前資料
list.remove(i);
//刪除完當前的條目 重新判斷商鋪的顯示隱藏
setFirst(list);
//呼叫重新求和
sum(list);
notifyDataSetChanged();
}
});
//加減號的監聽,
holder.custom.setCustomListener(new CustomView.CustomListener() {
@Override
public void jianjian(int count) {
//改變資料來源中的數量
list.get(i).setNum(count);
notifyDataSetChanged();
sum(list);
}
//輸入值 求總價
@Override
public void shuruzhi(int count) {
list.get(i).setNum(count);
notifyDataSetChanged();
sum(list);
}
});
}
/**
* 設定資料來源,控制是否顯示商家
* */
private void setFirst(List<ShoppBean.DataBean.ListBean> list) {
if(list.size()>0){
//如果是第一條資料就設定isFirst為1
list.get(0).setIsFirst(1);
//從第二條開始遍歷
for(int i=1;i<list.size();i++){
//如果和前一個商品是同一家商店的
if(list.get(i).getSellerid() == list.get(i-1).getSellerid()){
//設定成2不顯示商鋪
list.get(i).setIsFirst(2);
}else{
//設定成1顯示商鋪
list.get(i).setIsFirst(1);
//如果當前條目選中,把當前的商鋪也選中
if(list.get(i).isItem_check() == true){
list.get(i).setShop_check(list.get(i).isItem_check());
}
}
}
}
}
//求和的方法
private void sum(List<ShoppBean.DataBean.ListBean> list) {
//初始的總價為0
int totalNum = 0;
double totalPrice = 0.0;
boolean allCheck = true;
for(int i = 0;i<list.size();i++){
//把 已經選中的 條目 計算價格
if(list.get(i).isItem_check()){
totalNum += list.get(i).getNum();
totalPrice+= list.get(i).getNum()*list.get(i).getPrice();
}else{
//如果有個未選中,就標記為false
allCheck = false;
}
}
//介面回調出去 把總價 總數量 和allcheck 傳給view層
updateListener.setTotal(totalPrice+"",totalNum+"",allCheck);
}
//view層呼叫這個方法, 點選quanxuan按鈕的操作
public void queryAll(boolean checked){
for(int i = 0;i<list.size();i++){
list.get(i).setShop_check(checked);
list.get(i).setItem_check(checked);
}
notifyDataSetChanged();
sum(list);
}
@Override
public int getItemCount() {
return list==null?0:list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
public final CheckBox shop_check;
public final TextView shopp_commodity;
public final CheckBox item_check;
public final ImageView item_image;
public final TextView item_name;
public final TextView item_price;
public final CustomView custom;
public final ImageView item_del;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
shop_check = itemView.findViewById(R.id.shop_check);
shopp_commodity = itemView.findViewById(R.id.shopp_commodity);
item_check = itemView.findViewById(R.id.item_check);
item_image = itemView.findViewById(R.id.item_image);
item_name = itemView.findViewById(R.id.item_name);
item_price = itemView.findViewById(R.id.item_price);
custom = itemView.findViewById(R.id.custom);
item_del = itemView.findViewById(R.id.item_del);
}
}
private UpdateListener updateListener;
public void setUpdateListener(UpdateListener updateListener){
this.updateListener = updateListener;
}
//定義介面
public interface UpdateListener{
void setTotal(String total,String num,boolean allCheck);
}
}
8.MainActivity頁面
package com.example.shoppingcart01.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import com.example.shoppingcart01.R;
import com.example.shoppingcart01.adaper.ShopAdaper;
import com.example.shoppingcart01.apis.Apis;
import com.example.shoppingcart01.bean.ShoppBean;
import com.example.shoppingcart01.presenter.PresenterImpl;
import com.example.shoppingcart01.view.Iview;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements Iview {
private PresenterImpl presenter;
private RecyclerView recyclerView;
private CheckBox query;
private TextView text_total;
private TextView text_shopp;
private ShopAdaper adaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new PresenterImpl(this);
initView();
}
private void initView() {
//獲取資源id
recyclerView = findViewById(R.id.recycle_view);
query = findViewById(R.id.query);
text_total = findViewById(R.id.text_total);
text_shopp = findViewById(R.id.text_shopp);
//1為不選中
query.setTag(1);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(OrientationHelper.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
//建立介面卡
adaper = new ShopAdaper(this);
recyclerView.setAdapter(adaper);
//呼叫介面卡裡的介面
adaper.setUpdateListener(new ShopAdaper.UpdateListener() {
@Override
public void setTotal(String total, String num, boolean allCheck) {
//設定ui的改變
text_shopp.setText("共"+num+"件商品");
text_total.setText("總價:¥"+total+"元");
if(allCheck){
query.setTag(2);
}else{
query.setTag(1);
}
query.setChecked(allCheck);
}
});
//這裡只做ui更改, 點選全選按鈕,,調到adapter裡面操作
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//呼叫adapter裡面的方法 ,,把當前quanxuan狀態傳遞過去
int tag = (int) query.getTag();
if(tag == 1){
query.setTag(2);
}else{
query.setTag(1);
}
adaper.queryAll(query.isChecked());
}
});
//請求網址
Map<String,String> map = new HashMap<>();
map.put("uid","71");
presenter.startRequest(Apis.URL_SHOPP_CART,map,ShoppBean.class);
}
@Override
public void requestData(Object o) {
if(o instanceof ShoppBean){
ShoppBean bean = (ShoppBean) o;
if(bean==null || !bean.isSuccess()){
Toast.makeText(MainActivity.this,bean.getMsg(),Toast.LENGTH_SHORT).show();
}else{
adaper.add(bean);
}
}
}
@Override
public void requestFail(Object o) {
if(o instanceof Exception){
Exception e = (Exception) o;
e.printStackTrace();
}
Toast.makeText(MainActivity.this,"網路請求錯誤",Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDetach();
}
}
詳細程式碼 請訪問一下連結
https://github.com/guoxinyu1995/yuekao/tree/master/shoppingcart01