效果图:
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中