简单实现 一级列表购物车(固定数据)

效果图:



1. 主代码MAinActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.CheckBox;
import android.widget.TextView;
import com.example.cart.adapter.CartAdapter;
import com.example.cart.bean.CartBean;
import com.example.cart.util.StringUtil;
import com.google.gson.Gson;
import java.io.InputStream;
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.recyclerView)
    RecyclerView recyclerView;
    @Bind(R.id.selectAll)
    CheckBox selectAll;
    @Bind(R.id.sumCount)
    TextView sumCount;
    @Bind(R.id.sumPrice)
    TextView sumPrice;
    private List<CartBean.OrderDataBean.CartlistBean> list = new ArrayList<>();
    private LinearLayoutManager layoutManager;
    private CartAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        getData();      //获取数据
        selectAll.setTag(1);     //默认复选按钮都为 未选中 状态

        //设置布局管理器,适配器
        layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        adapter = new CartAdapter(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
        adapter.add(list);

        //适配器单个条目复选按钮的点击事件,价格变化
        adapter.setCheckBoxListener(new CartAdapter.CheckBoxListener() {
            @Override
            public void check(int position, int count, boolean check, List<CartBean.OrderDataBean.CartlistBean> list) {
                sumPrice(list);
            }
        });

        //适配器单个条目加减号按钮的点击事件,价格变化
        adapter.setCustomViewListener(new CartAdapter.CustomViewListener() {
            @Override
            public void click(int count, List<CartBean.OrderDataBean.CartlistBean> list) {
                sumPrice(list);
            }
        });

        //适配器单个条目删除按钮的点击事件,总价变化
        adapter.setDelListener(new CartAdapter.DelListener() {
            @Override
            public void del(int position, List<CartBean.OrderDataBean.CartlistBean> list) {
                sumPrice(list);
            }
        });
    }

    //模拟网络请求数据
    public void getData() {
        try {
            InputStream inputStream = getAssets().open("shop.json");
            String data = StringUtil.streamToString(inputStream, "utf-8");
            Gson gson = new Gson();
            CartBean cartBean = gson.fromJson(data, CartBean.class);
            System.out.println(cartBean);
            for (int i = 0; i < cartBean.getOrderData().size(); i++) {
                int length = cartBean.getOrderData().get(i).getCartlist().size();
                for (int j = 0; j < length; j++) {
                    list.add(cartBean.getOrderData().get(i).getCartlist().get(j));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //计算商品总价,设置没选择商品时总价为0,商品数量为0
    float price = 0;
    int count;
    public void sumPrice(List<CartBean.OrderDataBean.CartlistBean> list) {
        price = 0;
        count = 0;
        boolean allCheck = true;
        //遍历数据源
        for (CartBean.OrderDataBean.CartlistBean bean : list) {
            if (bean.isCheck()) {        //商品选中时,计算总价
                price += bean.getPrice() * bean.getCount();
                count += bean.getCount();
            } else {                    //只要有一个商品未选中,全选按钮 应该设置成 未选中
                allCheck = false;
            }
        }

        //设置商品总数及总价
        sumPrice.setText("总价:¥"+price);
        sumCount.setText("商品总数:"+count+"  件");

        //全选按钮是否选中时的tag值
        if (allCheck){
            selectAll.setTag(2);
            selectAll.setChecked(true);
        }else {
            selectAll.setTag(1);
            selectAll.setChecked(false);
        }
    }

    /**
     * 全选按钮 点击事件
     * 点击全选按钮设置所有复选框状态为true,否则为false
     * 1:未选中,2:选中
     */
    boolean select = false;
    @OnClick(R.id.selectAll)
    public void onViewClicked() {
        int tag = (Integer) selectAll.getTag();
        if (tag == 1) {
            selectAll.setTag(2);
            select = true;
        } else {
            selectAll.setTag(1);
            select = false;
        }
        //遍历数据源,根据tag值设置选择状态,然后刷新改变后的数据,重新添加
        for (CartBean.OrderDataBean.CartlistBean bean : list) {
            bean.setCheck(select);
        }
        adapter.notifyDataSetChanged();
        sumPrice(adapter.getList());
    }
}

2. 自定义view:加减号view页面

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import com.example.cart.R;
/**
 * 自定义view 实现加减号页面
 */
public class CustomView extends LinearLayout{
    private Button revserse;    //减号
    private Button add;         //加号
    private EditText editText;
    private int number = 1 ;

    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //设置布局
        View view = LayoutInflater.from(context).inflate(R.layout.customview, null, false);
        revserse =  (Button)view.findViewById(R.id.jian);
        add = (Button)view.findViewById(R.id.jia);
        editText = (EditText) view.findViewById(R.id.number);

        //点击减号时的情况变化
        revserse.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    String content =  editText.getText().toString().trim() ;
                    //商品数量大于0时才可以变化,等于0的情况不能出现
                    int count = Integer.valueOf(content);
                    if (count > 1){
                        number = count - 1;
                        editText.setText(number+"");

                        //当减号点击后,数值变化
                        if (listener != null){
                            listener.click(number);
                        }
                    }
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
            }
        });

        //点击加号时的情况变化
        add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    String content =  editText.getText().toString().trim() ;
                    int count = Integer.valueOf(content) + 1;
                    number = count;
                    editText.setText(count+"");
                    //当加号点击后,数值变化
                    if (listener != null){
                        listener.click(count);
                    }
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
            }
        });
        addView(view);
    }

    //设置方法获取EditText输入框的值
    public void  setEditText(int count){
        editText.setText(count+"");
    }
    //声明number变量
    public int getCurrentCount(){
        return number;
    }

    //定义回调接口,用于判断是否点击情况
    public ClickListener listener;
    public void setListener(ClickListener listener){
        this.listener = listener;
    }
    public interface ClickListener {
        public void click(int count);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

3.自定义适配器

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.example.cart.R;
import com.example.cart.bean.CartBean;
import com.example.cart.util.ImageLoaderUtil;
import com.example.cart.view.CustomView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;

//购物车商品适配器
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ItemViewHolder> {
    private Context context;
    private List<CartBean.OrderDataBean.CartlistBean> list;

    public CartAdapter(Context context) {
        this.context = context;
    }

    //添加数据的方法
    public void add(List<CartBean.OrderDataBean.CartlistBean> list) {
        if (this.list == null) {
            this.list = new ArrayList<>();
        }
        this.list.addAll(list);
        notifyDataSetChanged();
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(context, R.layout.item, null);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ItemViewHolder holder, final int position) {
        //防止checkbox 滑动 错乱
        holder.checkbox.setChecked(list.get(position).isCheck());
        holder.title.setText(list.get(position).getProductName());
        holder.price.setText("¥ " + list.get(position).getPrice());

        //获取自定义view页面EditText输入框的值
        holder.customviewId.setEditText(list.get(position).getCount());
        ImageLoader.getInstance().displayImage(list.get(position).getDefaultPic(), holder.dianImage, ImageLoaderUtil.getDefaultOption());
        //复选按钮的选中点击事件,获取数据价格
        holder.checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.get(position).setCheck(holder.checkbox.isChecked());
                notifyDataSetChanged();
                if (checkBoxListener != null) {
                    checkBoxListener.check(position, holder.customviewId.getCurrentCount(), holder.checkbox.isChecked(), list);
                }
            }
        });

        //加减按钮的监听事件 ,更新当前条目数据价格
        holder.customviewId.setListener(new CustomView.ClickListener() {
            @Override
            public void click(int count) {
                //更改变化后的商品数量
                list.get(position).setCount(count);
                notifyDataSetChanged();

                if (customViewListener != null){
                    customViewListener.click(count,list);
                }
            }
        });

        //删除按钮的监听事件 ,删除当前条目数据
        holder.btnDel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.remove(position);
                notifyDataSetChanged();

                if (delListener != null){
                    delListener.del(position,list);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return list == null ? 0 : list.size();
    }

    static class ItemViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.checkbox)
        CheckBox checkbox;
        @Bind(R.id.dianImage)
        ImageView dianImage;
        @Bind(R.id.price)
        TextView price;
        @Bind(R.id.customviewId)
        CustomView customviewId;
        @Bind(R.id.title)
        TextView title;
        @Bind(R.id.btn_del)
        Button btnDel;
        public ItemViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public List<CartBean.OrderDataBean.CartlistBean> getList() {
        return list;
    }

    //定义checkbox 点击事件的回调接口
    public CheckBoxListener checkBoxListener;
    public void setCheckBoxListener(CheckBoxListener listener) {
        this.checkBoxListener = listener;
    }
    public interface CheckBoxListener {
        public void check(int position, int count, boolean check, List<CartBean.OrderDataBean.CartlistBean> list);
    }

    //定义加减按钮 点击事件的回调接口
    public CustomViewListener customViewListener;
    public void setCustomViewListener(CustomViewListener customViewListener) {
        this.customViewListener = customViewListener;
    }
    public interface CustomViewListener {
        public void click(int count, List<CartBean.OrderDataBean.CartlistBean> list);
    }

    //定义删除按钮 点击事件的回调接口
    public DelListener delListener;
    public void setDelListener(DelListener delListener) {
        this.delListener = delListener;
    }
    public interface DelListener {
        public void del(int position, List<CartBean.OrderDataBean.CartlistBean> list);
    }
}
4. main文件夹下的assets文件夹下:shop.json文件(自定义)

{  "code" : 200 ,
  "orderData" : [
    {

      "shopId": 1,
      "shopName":"京东自营",
      "cartlist": [
        {
          "id": 1,
          "shopId": 1,
          "shopName": "京东自营",
          "defaultPic": "https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg",
          "productId": 1,
          "productName": "三只松鼠_零食大礼包",
          "color": "黑色",
          "size": "18L",
          "price": 20,
          "count":1
        },
        {
          "id": 2,
          "shopId": 1,
          "shopName": "京东自营",
          "defaultPic": "https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg",
          "productId": 2,
          "productName": "小米心跳手环",
          "color": "白色",
          "size": "20XXL",
          "price": 148,
          "count": 1
        }
      ]
    }
  ,
    {
      "shopId": 2,
      "shopName":"海澜之家",
      "cartlist": [
        {
          "id": 1,
          "shopId": 2,
          "shopName": "海澜之家",
          "defaultPic": "https://img30.360buyimg.com/popWaterMark/jfs/t4075/83/1343091204/132469/9034cb9c/5873496bN68020ba8.jpg",
          "productId": 1,
          "productName": "短袖T恤男 2017夏季新品",
          "color": "蓝色",
          "size": "30X",
          "price": 181,
          "count":1
        }
      ]
    }
  ,
    {
      "shopId": 3,
      "shopName":"OPPO官方旗舰店",
      "cartlist": [
        {
          "id": 1,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg",
          "productId": 1,
          "productName": "OPPO R11 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 1999,
          "count":1
        },
        {
          "id": 2,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg",
          "productId": 1,
          "productName": "OPPO R9 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 999,
          "count":1
        }
      ]
    }


  ,
    {
      "shopId": 3,
      "shopName":"OPPO官方旗舰店",
      "cartlist": [
        {
          "id": 1,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg",
          "productId": 1,
          "productName": "OPPO R11 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 1999,
          "count":1
        },
        {
          "id": 2,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg",
          "productId": 1,
          "productName": "OPPO R9 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 999,
          "count":1
        }
      ]
    }

  ,
    {
      "shopId": 3,
      "shopName":"OPPO官方旗舰店",
      "cartlist": [
        {
          "id": 1,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg",
          "productId": 1,
          "productName": "OPPO R11 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 1999,
          "count":1
        },
        {
          "id": 2,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg",
          "productId": 1,
          "productName": "OPPO R9 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 999,
          "count":1
        }
      ]
    }

  ,
    {
      "shopId": 3,
      "shopName":"OPPO官方旗舰店",
      "cartlist": [
        {
          "id": 1,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg",
          "productId": 1,
          "productName": "OPPO R11 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 1999,
          "count":1
        },
        {
          "id": 2,
          "shopId": 3,
          "shopName": "OPPO官方旗舰店",
          "defaultPic": "https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg",
          "productId": 1,
          "productName": "OPPO R9 全网通",
          "color": "蓝色",
          "size": "30X",
          "price": 999,
          "count":1
        }
      ]
    }


  ]
}
5. 把json文件解析封装的bean类(根据自己需要定义)

6. util工具包类:

1.  配置ImageLoader类:

(1)BaseApplication.java

package util;
import android.app.Application;
//全局初始化Application类
public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //配置imageLoader
        ImageLoaderUtil.init(this);
    }
}

(2)ImageLoaderUtil.java

package util;
import android.content.Context;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import java.io.File;
import exam.Month.R;
public class ImageLoaderUtil {
    /**
     * 初始化imageLoader
     * @param context
     */
    public static void init(Context context) {
        //1.获取配置config对象
        File cacheDir = StorageUtils.getCacheDirectory(context);  //缓存文件夹路径

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)

                .threadPoolSize(3) // default  线程池内加载的数量
                .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
                .tasksProcessingOrder(QueueProcessingType.FIFO) // default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
                .memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值
                .memoryCacheSizePercentage(13) // default
                .diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定义缓存路径
                .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
                .diskCacheFileCount(100)  // 可以缓存的文件数量
                // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
                .imageDownloader(new BaseImageDownloader(context)) // default
                .imageDecoder(new BaseImageDecoder(true)) // default
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
                .writeDebugLogs() // 打印debug log
                .build(); //开始构建


        //2.初始化配置...ImageLoader.getInstance()图片加载器的对象,单例模式
        ImageLoader.getInstance().init(config);
    }

    /**
     * imageLoader加载图片的默认选项
     * @return
     */
    public static DisplayImageOptions getDefaultOption(){

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的默认图片
                .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中

                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型

                .displayer(new SimpleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)

                .build();

        return options;
    }

    /**
     * imageLoader加载圆角图片....指定圆角的大小
     * @return
     */
    public static DisplayImageOptions getRoundedOption(int corner){

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中

                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型

                .displayer(new RoundedBitmapDisplayer(corner)) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)

                .build();

        return options;
    }

    /**
     * imageLoader加载圆形图片
     * @return
     */
    public static DisplayImageOptions getCircleOption(){

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中

                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型

                .displayer(new CircleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)

                .build();

        return options;
    }
}

2. 解析json数据:

StringUtil.java

package util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StringUtil {

    //解析数据的方法
    public static String streamToString(InputStream inputStream, String charset) {
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String s = null;
            StringBuilder builder = new StringBuilder();
            while ((s = bufferedReader.readLine()) != null){
                builder.append(s);
            }

            bufferedReader.close();
            return builder.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return  null;
    }
}

7. 布局xml文件

(1)主页面:activity_main.xml

<?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:layout_width="match_parent"
    android:layout_height="match_parent"    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:background="#FF7001"
        android:layout_height="58dp"
        android:id="@+id/relative">
        <TextView
            android:layout_centerInParent="true"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textColor="#fff"
            android:textSize="21sp"
            android:text="购物车"/>
        <TextView
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_marginRight="10dp"
            android:textColor="#fff"
            android:textSize="18sp"
            android:text="编辑"/>
    </RelativeLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_above="@+id/bottom"
        android:layout_below="@+id/relative"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

    <RelativeLayout
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:id="@+id/bottom"
        android:background="#3C3C3C"
        android:layout_height="58dp">
        <RelativeLayout
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <CheckBox
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:id="@+id/selectAll"
                android:textColor="#fff"
                android:textSize="16sp"
                android:text="全选"/>

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/selectAll">
                <TextView

                    android:layout_centerVertical="true"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:layout_marginLeft="18dp"
                    android:id="@+id/sumCount"
                    android:textColor="#fff"
                    android:textSize="16sp"
                    android:text="商品总数:0 件"/>
                <TextView
                    android:layout_centerVertical="true"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:layout_marginLeft="18dp"
                    android:id="@+id/sumPrice"
                    android:textColor="#fff"
                    android:textSize="16sp"
                    android:text="总价:¥ 0"/>
            </LinearLayout>
        </RelativeLayout>

        <Button
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_width="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_height="32dp"
            android:background="#FF7001"
            android:textColor="#fff"
            android:textSize="18sp"
            android:text="结算"/>
    </RelativeLayout>
 </RelativeLayout>

(2)条目页面:item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  />

    <ImageView
        android:id="@+id/dianImage"
        android:layout_width="68dp"
        android:layout_height="88dp" />

     <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/title"
            android:layout_marginTop="8dp"
            android:layout_marginLeft="28dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"  />

        <TextView
            android:id="@+id/price"
            android:layout_below="@+id/title"
            android:layout_marginRight="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"/>

        <com.example.cart.view.CustomView
            android:id="@+id/customviewId"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="100dp"
            android:layout_below="@+id/price" ></com.example.cart.view.CustomView>

         <Button
             android:layout_alignBottom="@+id/customviewId"
             android:layout_toRightOf="@+id/customviewId"
             android:layout_marginLeft="80dp"
             android:background="#fd7002"
             android:layout_height="25dp"
             android:layout_width="63dp"
             android:id="@+id/btn_del"
             android:textColor="#fff"
             android:gravity="center"
             android:text="删除"/>
     </RelativeLayout>

</LinearLayout>

(3)自定义view面:customview.xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="horizontal">

        <Button
            android:background="#00FFFFFF"
            android:layout_height="50dp"
            android:layout_width="30dp"
            android:gravity="center"
            android:textStyle="bold"
            android:textSize="20sp"
            android:id="@+id/jian"
            android:text="-"   />

        <EditText
            android:layout_width="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            android:layout_height="50dp"
            android:inputType="number"
            android:id="@+id/number"
            android:textSize="20sp"
            android:text="1"/>

        <Button
            android:background="#00FFFFFF"
            android:layout_height="50dp"
            android:layout_width="30dp"
            android:gravity="center"
            android:textStyle="bold"
            android:textSize="20sp"
            android:id="@+id/jia"
            android:text="+"  />
</LinearLayout>

8. 最后在清单文件中,添加请求网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

请求网络数据的一级列表购物车参考GitHub代码:

在GitHub的ShiXun_RiKao中的 ThirdWeek_MoNi  Model中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值