使用RecyclerView+OkHttp实现购物车
来源:互联网 发布:回收站误删恢复软件 编辑:程序博客网 时间:2024/06/05 06:14
首先先导入依赖
compile 'com.squareup.okhttp3:okhttp:3.9.0'compile 'com.android.support:recyclerview-v7:25.3.1'compile 'com.jakewharton:butterknife:7.0.1'compile files('libs/gson-2.3.1.jar')compile files('libs/universal-image-loader-1.9.3.jar')
设置权限
<uses-permission android:name="android.permission.INTERNET"/>
然后再main下创建assets文件夹,里面放入你要解析的json文件布局activity_main
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="bwie.com.app.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView> <LinearLayout android:layout_weight="0" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#FFFFFF" android:gravity="center_vertical" android:id="@+id/third_pay_linear" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <TextView android:id="@+id/tv_quanxuan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:drawableLeft="@drawable/shopcart_unselected" android:text="全选" android:drawablePadding="5dp" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <TextView android:id="@+id/tv_jiage" android:layout_width="200dp" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingTop="10dp" android:text="总价:" android:textColor="#000000" android:textSize="16sp" /> <TextView android:textColor="#000000" android:id="@+id/tv_shangpin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dp" android:text="共0件商品" android:textSize="14sp" android:paddingBottom="10dp" /> </LinearLayout> <TextView android:id="@+id/tv_jiesuan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FF0000" android:text="去结算" android:paddingLeft="30dp" android:paddingRight="30dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:textColor="#FFFFFF" android:layout_marginRight="10dp" /> </LinearLayout></RelativeLayout>customview布局在里面实现商品的加减
<?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"> <Button android:layout_width="10dp" android:layout_height="wrap_content" android:id="@+id/btn_jian" android:text="-" android:background="#00FFFFFF"/> <EditText android:text="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/content"/> <Button android:background="#00FFFFFF" android:text="+" android:id="@+id/btn_jia" android:layout_width="10dp" android:layout_height="wrap_content" /></LinearLayout>shop_adapter适配器的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:id="@+id/cb_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginTop="20dp"> <ImageView android:id="@+id/iv_tupian" android:layout_width="80dp" android:layout_height="80dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tv_jiage" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <bwie.com.app.CustomView android:id="@+id/cv" android:layout_width="100dp" android:layout_height="50dp"/> </LinearLayout> <Button android:id="@+id/btn_shan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00f" android:text="删除" /> </LinearLayout></LinearLayout>--------------------------------------下面是代码------------------------------MainActivity
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import com.google.gson.Gson;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import butterknife.Bind;import butterknife.ButterKnife;import butterknife.OnClick;public class MainActivity extends AppCompatActivity { @Bind(R.id.rv) RecyclerView rv; @Bind(R.id.tv_quanxuan) TextView quanxuan; @Bind(R.id.tv_jiage) TextView jiage; @Bind(R.id.tv_shangpin) TextView shangpin; @Bind(R.id.tv_jiesuan) TextView jiesuan; @Bind(R.id.third_pay_linear) LinearLayout thirdPayLinear; private List<ShopBean.OrderDataBean.CartlistBean> list = new ArrayList<>(); private ShopAdapter adapter; private LinearLayoutManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); // 1 为选中 2 选中 quanxuan.setTag(1); manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); rv.setLayoutManager(manager); adapter = new ShopAdapter(this); rv.setAdapter(adapter); getData(); adapter.setCheckBoxListener(new ShopAdapter.CheckBoxListener() { @Override public void check(int position, int count, boolean check,List<ShopBean.OrderDataBean.CartlistBean> list) { sum(list); } }); adapter.setCustomViewListener(new ShopAdapter.CustomViewListener() { @Override public void click(int count,List<ShopBean.OrderDataBean.CartlistBean> list1) { sum(list1); } }); adapter.setDelListener(new ShopAdapter.DelListener() { @Override public void del(int position,List<ShopBean.OrderDataBean.CartlistBean> list2) { sum(list2); } }); } float price = 0; int count; private void sum(List<ShopBean.OrderDataBean.CartlistBean> list) { price = 0; count = 0; boolean allCheck = true ; for (ShopBean.OrderDataBean.CartlistBean bean : list) { if (bean.isCheck()) { //得到总价 price += bean.getPrice() * bean.getCount(); //得到商品个数 count += bean.getCount(); }else { // 只要有一个商品未选中,全选按钮 应该设置成 为选中 allCheck = false; } } jiage.setText("总价: " + price); shangpin.setText("共" + count + "件商品"); if(allCheck){ quanxuan.setTag(2); quanxuan.setBackgroundResource(R.drawable.shopcart_selected); }else { quanxuan.setTag(1); quanxuan.setBackgroundResource(R.drawable.shopcart_unselected); } } public void getData() { try { //模拟网络请求 InputStream inputStream = getAssets().open("shop.json"); String data = convertStreamToString(inputStream); Gson gson = new Gson(); ShopBean shopBean = gson.fromJson(data, ShopBean.class); for (int i = 0; i < shopBean.getOrderData().size(); i++) { int length = shopBean.getOrderData().get(i).getCartlist().size(); for (int j = 0; j < length; j++) { list.add(shopBean.getOrderData().get(i).getCartlist().get(j)); } } adapter.add(list); } catch (Exception e) { e.printStackTrace(); } } public static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } boolean select = false ; @OnClick(R.id.tv_quanxuan) public void onClick() { //全选按钮 点击事件 int tag = (Integer) quanxuan.getTag() ; if(tag ==1){ quanxuan.setTag(2); select = true; } else { quanxuan.setTag(1); select = false; } for (ShopBean.OrderDataBean.CartlistBean bean : list) { bean.setCheck(select); } adapter.notifyDataSetChanged(); sum(adapter.getList()); }}CustomView类
import android.content.Context;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;public class CustomView extends LinearLayout { private EditText editText; private Button revserse; private Button add; private int mCount = 1 ; public CustomView(Context context) { super(context); } public CustomView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); View view = LayoutInflater.from(context).inflate(R.layout.customview,null,false); revserse = (Button) view.findViewById(R.id.btn_jian); add = (Button) view.findViewById(R.id.btn_jia); editText = (EditText) view.findViewById(R.id.content); revserse.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //减号 try { String content = editText.getText().toString().trim() ; int count = Integer.valueOf(content)-1; mCount = count; if(count > 1){ editText.setText(count+""); } if(listener != null){ listener.click(count); } } catch (NumberFormatException e) { e.printStackTrace(); } } }); add.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //加号 try { String content = editText.getText().toString().trim() ; int count = Integer.valueOf(content)+1; mCount = count; editText.setText(count+""); if(listener != null){ listener.click(count); } } catch (NumberFormatException e) { e.printStackTrace(); } } }); addView(view); } public int getCurrentCount(){ return mCount ; } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public ClickListener listener; public void setListener(ClickListener listener){ this.listener = listener; } /** * 加减号 点击事件 */ public interface ClickListener { public void click(int count); }}ShopAdapter适配器类
import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.TextView;import com.nostra13.universalimageloader.core.ImageLoader;import java.util.ArrayList;import java.util.List;import butterknife.Bind;import butterknife.ButterKnife;public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.IViewHolder> { private Context context; private List<ShopBean.OrderDataBean.CartlistBean> list; public ShopAdapter(Context context) { this.context = context; } /** * 更新数据 * * @param list */ public void add(List<ShopBean.OrderDataBean.CartlistBean> list) { if (this.list == null) { this.list = new ArrayList<>(); } this.list.addAll(list); notifyDataSetChanged(); } @Override public IViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.shop_adapter, null); return new IViewHolder(view); } @Override public void onBindViewHolder(final IViewHolder holder, final int position) { //防止checkbox 滑动 错乱 holder.checkbox.setChecked(list.get(position).isCheck()); holder.jiage.setText(list.get(position).getPrice() + ""); ImageLoader.getInstance().displayImage(list.get(position).getDefaultPic(), holder.tupian); /** * checkbox 点击事件 */ holder.checkbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.get(position).setCheck(holder.checkbox.isChecked()); notifyDataSetChanged(); if (checkBoxListener != null) { checkBoxListener.check(position, holder.cv.getCurrentCount(), holder.checkbox.isChecked(), list); } } }); /** * 加减监听 */ holder.cv.setListener(new CustomView.ClickListener() { @Override public void click(int count) { //更新数据源 list.get(position).setCount(count); notifyDataSetChanged(); if (listener != null) { listener.click(count, list); } } }); /** * 删除点击事件 */ holder.shan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.remove(position); notifyDataSetChanged(); if (delListener != null) { delListener.del(position, list); } } }); } @Override public int getItemCount() { return list == null ? 0 : list.size(); } static class IViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.cb_cb) CheckBox checkbox; @Bind(R.id.iv_tupian) ImageView tupian;//图片 @Bind(R.id.tv_jiage) TextView jiage;//价格 @Bind(R.id.cv) CustomView cv;//引用加减布局 @Bind(R.id.btn_shan) Button shan;//删除按钮 IViewHolder(View view) { super(view); ButterKnife.bind(this, view); } } public List<ShopBean.OrderDataBean.CartlistBean> getList() { return list; } CheckBoxListener checkBoxListener; /** * checkbox 点击事件 * * @param listener */ public void setCheckBoxListener(CheckBoxListener listener) { this.checkBoxListener = listener; } interface CheckBoxListener { public void check(int position, int count, boolean check, List<ShopBean.OrderDataBean.CartlistBean> list); } CustomViewListener listener; /** * 加减号 点击事件 * * @param listener */ public void setCustomViewListener(CustomViewListener listener) { this.listener = listener; } interface CustomViewListener { public void click(int count, List<ShopBean.OrderDataBean.CartlistBean> list); } DelListener delListener; /** * 加减号 删除按钮事件 * * @param listener */ public void setDelListener(DelListener listener) { this.delListener = listener; } interface DelListener { public void del(int position, List<ShopBean.OrderDataBean.CartlistBean> list); }}M类是用来加载图片的
import android.app.Application;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;public class M extends Application{ @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration aDefault = ImageLoaderConfiguration.createDefault(getApplicationContext()); ImageLoader.getInstance().init(aDefault); }}ShopBean类里面是要解析的文件
里面布局里有两张图片我就不上传了,可以用其他图片代替import java.util.List;public class ShopBean { private int code; private List<OrderDataBean> orderData; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public List<OrderDataBean> getOrderData() { return orderData; } public void setOrderData(List<OrderDataBean> orderData) { this.orderData = orderData; } public static class OrderDataBean { private int shopId; private String shopName; private List<CartlistBean> cartlist; public int getShopId() { return shopId; } public void setShopId(int shopId) { this.shopId = shopId; } public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName; } public List<CartlistBean> getCartlist() { return cartlist; } public void setCartlist(List<CartlistBean> cartlist) { this.cartlist = cartlist; } public static class CartlistBean { private int id; private int shopId; private String shopName; private String defaultPic; private int productId; private String productName; private Object color; private Object size; private int price; private int count; private boolean check; //商品是否被选中 private boolean isSelect = true; //是否是第一个 如果isfirst 等于1 显示商户的名称, 否则隐藏商户的名称 private int isFirst = 2; //商户是否被选中 private boolean isShopSelect = true; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getShopId() { return shopId; } public void setShopId(int shopId) { this.shopId = shopId; } public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName; } public String getDefaultPic() { return defaultPic; } public void setDefaultPic(String defaultPic) { this.defaultPic = defaultPic; } public int getProductId() { return productId; } public void setProductId(int productId) { this.productId = productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Object getColor() { return color; } public void setColor(Object color) { this.color = color; } public Object getSize() { return size; } public void setSize(Object size) { this.size = size; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public boolean isSelect() { return isSelect; } public void setSelect(boolean select) { isSelect = select; } public int getIsFirst() { return isFirst; } public void setIsFirst(int isFirst) { this.isFirst = isFirst; } public boolean isShopSelect() { return isShopSelect; } public void setShopSelect(boolean shopSelect) { isShopSelect = shopSelect; } public boolean isCheck() { return check; } public void setCheck(boolean check) { this.check = check; } } }}这是运行结果,效果有点不美观,但是注重效果
阅读全文
1 0
- 使用RecyclerView+OkHttp实现购物车
- OkHttp+RecyclerView购物车(二)
- 使用RecyclerView实现购物车
- 使用recycleview,okhttp实现购物车
- RecyclerView实现购物车
- 购物车Recyclerview实现
- RecyclerView实现购物车
- MVP+OKhttp+拦截器+RecyclerView+自定义view 实现请求网络数据的二级列表购物车
- Recyclerview嵌套Recyclerview实现简单购物车
- RecyclerView 实现购物车功能
- Okhttp结合RecyclerView使用
- Android-RecyclerView实现购物车简单功能
- Android-RecyclerView实现购物车简单功能
- RecyclerView条目跳转+SpringView数据刷新加载+MVP+OKhttp+拦截器+自定义view 实现请求网络数据的二级列表购物车
- android购物车二级列表实现+MVP+Okhttp
- 购物车Recyclerview
- 使用MVP,recycleview,okhttp生成二级购物车。
- 用RecyclerView多布局实现购物车+随便逛一逛
- prototype.js 让你更深入的了解javascript的面向对象特性
- 欢迎使用CSDN-markdown编辑器
- NSString 类的内存管理问题
- 网络编程——UDP
- [svc]kvm笔记
- 使用RecyclerView+OkHttp实现购物车
- linux 常用的20命令
- 如何搭建Angular的环境
- 常用排序算法总结
- 补充的
- nodejs+express搭建自己的服务框架
- angularJS添加表格,通过过滤器查找
- 浅谈堆和栈的区别
- Socket使用方式总结