首先先导入依赖
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; } } } }这是运行结果,效果有点不美观,但是注重效果