1.先定义bean类
(展示两个数据)
public class Seller {
public String sellerName;
public int sellerid;
public List<Product> list;
public boolean isCheck;
}
public class Product {
public String bargainPrice;
public String createtime;
public String detailUrl;
public String images;
public int num;
public int pid;
/**
* 只能整型 字符串
*/
public String price;
public int pscid;
public int selected;
public int sellerid;
public String subhead;
public String title;
}
public class CartData {
public String msg;
public String code;
public List<Seller> data;
}
2》定义接口
public interface ITask {
void getCarts(String url, OkCallback callback);
}
3》创建类实现接口
public class Task implements ITask{
@Override
public void getCarts(String url, OkCallback callback) {
OK.getOk().doGet(url,callback);
}
}
2.Presenter
1》定义接口
public interface IPresenter extends BasePre{
void getCarts();
}
2》实现接口
public class MyPresenter implements IPresenter {
ITask task;
IView view;
public MyPresenter(ShoppingCarActivity activity){
task=new Task();
view=activity;
}
@Override
public void getCarts() {
task.getCarts("http://www.zhaoapi.cn/product/getCarts?uid=71", new OkCallback() {
@Override
public void onUI(String json) {
Gson gson=new Gson();
CartData cartData = gson.fromJson(json, CartData.class);
view.showCart(cartData.data);
}
@Override
public void onFailed(String json) {
}
});
}
@Override
public void onDestroy() {
//销毁视图
view=null;
}
}
3.View
1》定义接口
public interface IView {
void showCart(List<Seller> sellers);
}
2》适配器
public class CartAdapter extends BaseExpandableListAdapter {
List<Seller> sellers;//商家列表
Context context;
LayoutInflater inflater;//初始化视图类
ImageView img_check_all;//全选状态展开
boolean isCheckAll=false;//全选状态标记
TextView txt_total_price;//合计总价展示控件
public CartAdapter(Context context) {
this.sellers =new ArrayList<>();
this.inflater= LayoutInflater.from(context);
this.context = context;
}
//添加数据
public void addData(List<Seller> list) {
sellers.addAll(list);//添加数据
notifyDataSetChanged();//刷新数据
}
/**
* 绑定顶部的总计价格控件
*
* @param txt_total_price
*/
public void setTotalPrice(TextView txt_total_price) {
this.txt_total_price = txt_total_price;
}
/**
* 绑定全选按钮的控件
*
* @param img_check_all
*/
public void setCheckAll(ImageView img_check_all) {
this.img_check_all = img_check_all;
}
/**
* 计算所选产品价格,只要改变购物车,价格重新计算
*/
private void sumPrice() {
int total = 0;//计算总价,最后赋值给控件
for (Seller seller : sellers) {//遍历商家
if (seller.isCheck) {//选中的店铺
for (Product product : seller.list) {
if (product.selected == 1) {//选中的产品的价格计算
//解析价格
int price = (int) Double.parseDouble(product.price);
//累加价格
total = total + (price * product.num);
}
}
}
}
//把最终结果赋值给控件
txt_total_price.setText("合计¥" + total);
}
/**
* 全选方案
*/
public void checkAll() {
for (Seller seller : sellers) {//遍历商家
seller.isCheck = true;//设置选中
for (Product product : seller.list) {//遍历产品
product.selected = 1;//设置选中
}
}
//重新甲酸商品价格
sumPrice();
//刷新页面
notifyDataSetChanged();
}
/**
* 默认全部展开
*
* @param listView
*/
public void expandGroup(ExpandableListView listView) {
for (int i = 0; i < getGroupCount(); i++) {
listView.expandGroup(i);
}
}
/**
* 获取商家数量
*
* @return
*/
@Override
public int getGroupCount() {
return sellers.size();
}
/**
* 商家下面有几个产品
*
* @param i
* @return
*/
@Override
public int getChildrenCount(int i) {
return sellers.get(i).list.size();
}
/**
* 获取商家类
*
* @param i
* @return
*/
@Override
public Seller getGroup(int i) {
return sellers.get(i);
}
/**
* 获取产品
*
* @param i
* @param i1
* @return
*/
@Override
public Product getChild(int i, int i1) {
return sellers.get(i).list.get(i1);
}
/**
* 固定商家ID
*
* @param i
* @return
*/
@Override
public long getGroupId(int i) {
Seller seller=getGroup(i);
return seller.sellerid;
}
/**
* 获取商品ID
*
* @param i
* @param i1
* @return
*/
@Override
public long getChildId(int i, int i1) {
Product product=getChild(i,i1);
return product.pid;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
SellerViewHolder holder;
if (view==null){
view=inflater.inflate(R.layout.item_store,viewGroup,false);
holder=new SellerViewHolder();
holder.store_checked=view.findViewById(R.id.store_checked);
holder.store_name=view.findViewById(R.id.store_name);
view.setTag(holder);
}else {
holder= (SellerViewHolder) view.getTag();
}
Seller seller=getGroup(i);
holder.store_name.setText(seller.sellerName);
return view;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
ProductViewHolder holder;
if (view==null){
view=inflater.inflate(R.layout.item_product,viewGroup,false);
holder=new ProductViewHolder();
holder.product_checked=view.findViewById(R.id.product_checked);
holder.product_img=view.findViewById(R.id.product_img);
holder.product_title=view.findViewById(R.id.product_title);
holder.product_price=view.findViewById(R.id.product_price);
view.setTag(holder);
}else {
holder= (ProductViewHolder) view.getTag();
}
Product product=getChild(i,i1);
holder.product_title.setText(product.title);
holder.product_price.setText(product.price);
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
class SellerViewHolder{
ImageView store_checked;
TextView store_name;
}
class ProductViewHolder{
ImageView product_checked,product_img;
TextView product_title,product_price;
}
}
4.主xml
<RelativeLayout
android:id="@+id/relative"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image_fan"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/textView"
android:layout_marginStart="12dp"
android:src="@drawable/fanhui" />
<TextView
android:id="@+id/shopping_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:text="购物车"
android:textSize="22dp"
/>
<ExpandableListView
android:id="@+id/expandable_listview"
android:layout_width="match_parent"
android:layout_height="530dp"
android:layout_below="@id/shopping_title"
></ExpandableListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/relative2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true">
<ImageView
android:id="@+id/query_checked"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentBottom="true"
android:src="@drawable/ic_checked" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="30dp"
android:text="全选" />
<TextView
android:id="@+id/txt_total_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="textview"
android:textSize="18dp" />
</RelativeLayout>
商家布局页面
<ImageView
android:id="@+id/store_checked"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginTop="8dp"
android:layout_marginLeft="2dp"
android:layout_alignParentStart="true"
android:src="@drawable/ic_checked" />
<TextView
android:id="@+id/store_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="textview"
android:textSize="18dp"
android:textColor="#000"
android:layout_marginTop="8dp"
android:layout_marginLeft="30dp"
/>
商品布局文件
<ImageView
android:id="@+id/product_checked"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginTop="43dp"
android:layout_marginLeft="25dp"
android:src="@drawable/ic_checked" />
<ImageView
android:id="@+id/product_img"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="58dp"
android:layout_marginTop="13dp"
android:src="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/product_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/product_img"
android:layout_marginStart="147dp"
android:lines="2"
android:text="TextView"
android:textSize="18dp"
android:textColor="#000"
/>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/product_title"
android:layout_below="@+id/product_checked"
android:lines="2"
android:text="¥:"
android:textColor="#FF0000"
android:textSize="20dp" />
<TextView
android:id="@+id/product_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/product_img"
android:layout_toEndOf="@+id/textView4"
android:text="TextView"
android:textColor="#FF0000"
android:textSize="20dp"
/>
<View.SumAddView
android:id="@+id/add_sum"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
5.自定义view
1》布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_height="match_parent">
<ImageView
android:id="@+id/reduce"
android:layout_width="20dp"
android:src="@drawable/ic_reduce"
android:layout_height="20dp" />
<TextView
android:id="@+id/txt_sum"
android:text="1"
android:textSize="16sp"
android:textColor="@android:color/black"
android:textStyle="bold"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/add"
android:layout_width="20dp"
android:src="@drawable/ic_add"
android:layout_height="20dp" />
</LinearLayout>
2》
public class SumAddView extends LinearLayout {
private Context context;
private ImageView add;//增加产品数量按钮
private ImageView reduce;//减少产品数量按钮
private TextView sum;//展示产品数量
private int totalSum = 1;//记录商品数量
private int limitSum = 5;//最多添加几件商品
//定义点击事件
private SumClickListener listener;
/**
* 绑定点击事件
*
* @param listener
*/
public void setSumClickListener(SumClickListener listener) {
this.listener = listener;
}
public void setSum(int num) {
totalSum = num;//设置初试数量
this.sum.setText("" + num);
}
/**
* 设置限购的数量
*
* @param limitSum
*/
public void setLimitSum(int limitSum) {
if (limitSum > 0) {
this.limitSum = limitSum;
} else {
this.limitSum = 5;
}
}
/**
* 构造函数
*
* @param context
* @param attrs
*/
public SumAddView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
//初始化UI
initView(context);
}
/**
* 舒适化视图
*
* @param context
*/
private void initView(Context context) {
View view = View.inflate(context, R.layout.layout_add_sum_view, this);
add = (ImageView) view.findViewById(R.id.add);
reduce = (ImageView) view.findViewById(R.id.reduce);
sum = (TextView) view.findViewById(R.id.txt_sum);
//添加点击事件
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
addClick();
}
});
//减少
reduce.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
reduceClick();
}
});
}
/**
* 增加商品数量
*/
public void addClick() {
totalSum++;
if (totalSum >= limitSum) {
totalSum = limitSum;//TODO
Toast.makeText(context, "每人限购" + limitSum + "件", Toast.LENGTH_SHORT).show();
}
//回调事件
if (listener != null) {
listener.sumClick(totalSum);
}
sum.setText(totalSum + "");
}
/**
* 减少商品数量
*/
public void reduceClick() {
totalSum--;
if (totalSum > 0) {
sum.setText(totalSum + "");
} else {
totalSum = 1;//TODO
Toast.makeText(context, "不能再减少了", Toast.LENGTH_SHORT).show();
sum.setText(totalSum + "");
}
//回调事件
if (listener != null) {
listener.sumClick(totalSum);
}
}
/**
* 回调商品数量点击事件
*/
interface SumClickListener {
void sumClick(int psum);
}
}
6.activity
public class ShoppingCarActivity extends AppCompatActivity implements IView{
CartAdapter cartAdapter;
ExpandableListView listView;
MyPresenter presenter;
ImageView query_checked;
TextView txt_total_price;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopping_car);
presenter=new MyPresenter(this);
presenter.getCarts();
initView();
}
private void initView() {
listView = (ExpandableListView) findViewById(R.id.expandable_listview);
//TODO 设置二级列表,不能关闭
listView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
return true;
}
});
//TODO 去掉默认箭头
listView.setGroupIndicator(null);
cartAdapter = new CartAdapter(this);
listView.setAdapter(cartAdapter);
query_checked = (ImageView) findViewById(R.id.query_checked);
txt_total_price=findViewById(R.id.txt_total_price);
query_checked.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
cartAdapter.setTotalPrice(txt_total_price);
cartAdapter.setCheckAll(query_checked);
}
@Override
public void showData(List<Shop> shops) {
}
@Override
public void showCart(List<Seller> sellers) {
cartAdapter.addData(sellers);//添加数据
cartAdapter.expandGroup(listView);//展开列表
cartAdapter.checkAll();//选中计算价格
}
}
购物车功能实现
2093

被折叠的 条评论
为什么被折叠?



