ListView实现的点餐页面(含热门推荐、购物车)

这是我的第一篇博文,主要是用来记录自己的学习过程,同时方便和大家互相学习。第一次写,写的不好,大家还请多包涵。
首先来看看这个页面的效果图:
该页面主体部分是两个listView,分别对应商品的分类列表和商品的详情列表。下面我们看看商品分类对应的适配器GoodsClassifyAdapter 和 GoodsDetailsAdapter的具体代码。
GoodsClassifyAdapter :
package com.example.henry.test.adapter;import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import com.example.henry.test.R;
import com.example.henry.test.entity.GoodsClassify;import java.util.ArrayList;
import java.util.List;/*** Description:商品分类的适配器* author: henry* Date: 16-4-20 下午1:47.*/
public class GoodsClassifyAdapter extends BaseAdapter {private Context context;private List<GoodsClassify> classifies = new ArrayList<>();private int selectedPostion = 0;    //选择的位置public GoodsClassifyAdapter(Context context,List<GoodsClassify> classifies){this.context = context;this.classifies = classifies;}@Overridepublic int getCount() {return classifies.size();}@Overridepublic Object getItem(int position) {return classifies.get(position);}@Overridepublic long getItemId(int position) {return position;}/*** 自定义方法,改变position* @param position*/public void clearSelection(int position) {selectedPostion = position;this.notifyDataSetChanged();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final ViewHolder holder ;if (convertView == null){convertView = View.inflate(context, R.layout.listitem_parentgoods,null);holder = new ViewHolder();holder.mName = (TextView) convertView.findViewById(R.id.tv_name);holder.mNum = (TextView) convertView.findViewById(R.id.tv_count);convertView.setTag(holder);}else {holder = (ViewHolder) convertView.getTag();}holder.mName.setText(classifies.get(position).getTypeName());setNum(position,holder.mNum);//设置选中位置的字体和背景颜色if (selectedPostion == position){convertView.setBackgroundColor(Color.WHITE);holder.mName.setTextColor(Color.GREEN);}else{convertView.setBackgroundColor(Color.LTGRAY);holder.mName.setTextColor(Color.GRAY);}return convertView;}/*** 设置商品数量的显示或隐藏* @param position* @param textView*/public void setNum(int position,TextView textView){int num = 0;for (int i = 0;i < classifies.get(position).getProdList().size();i++){num += classifies.get(position).getProdList().get(i).getProdCount();}classifies.get(position).setCount(num);if (num == 0){textView.setVisibility(View.GONE);}else{textView.setVisibility(View.VISIBLE);textView.getPaint().setAntiAlias(true);textView.setText(num + "");}//设置商品第一列,即热门推荐数量隐藏if (position == 0){textView.setVisibility(View.GONE);}}class ViewHolder{private TextView mName;private TextView mNum;}
}

GoodsDetailsAdapter:

</pre><pre name="code" class="java">package com.example.henry.test.adapter;import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.example.henry.test.entity.GoodsDetails;
import com.example.henry.test.MainActivity;
import com.example.henry.test.app.MyApplication;
import com.example.henry.test.R;import org.apache.commons.collections.Bag;
import org.apache.commons.collections.bag.HashBag;import java.util.ArrayList;
import java.util.List;/*** Description:商品详细信息的适配器* author: henry* Date: 16-4-20 上午9:58.*/
public class GoodsDetailsAdapter extends BaseAdapter  {private MainActivity context;private Bag goodsList = new HashBag();private List<GoodsDetails> goodsDetailsList = new ArrayList<>();private int count;private GoodsClassifyAdapter classifyAdapter;private String id ;public GoodsDetailsAdapter(MainActivity context,List<GoodsDetails> goodsDetailsList,GoodsClassifyAdapter classifyAdapter){this.context = context;this.goodsDetailsList = goodsDetailsList;this.classifyAdapter = classifyAdapter;}@Overridepublic int getCount() {return goodsDetailsList.size();}@Overridepublic Object getItem(int position) {return goodsDetailsList.get(position);}@Overridepublic long getItemId(int position) {return position;}/*** 返回修改会的列表* @return*/public List<GoodsDetails> getList(){return goodsDetailsList;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {final GoodsDetails goodsDetails  = goodsDetailsList.get(position);final ViewHolder holder;if (convertView == null){convertView = View.inflate(context, R.layout.listitem_childgoods,null);holder = new ViewHolder();holder.mGoodsName = (TextView)convertView.findViewById(R.id.goods);holder.mGoodsPrice = (TextView)convertView.findViewById(R.id.price);holder.mGoodsNum = (TextView)convertView.findViewById(R.id.num);holder.mGoodsIcon = (ImageView)convertView.findViewById(R.id.icon_goods);holder.mGoodsAdd = (ImageView)convertView.findViewById(R.id.add);holder.mGoodsReduce = (ImageView)convertView.findViewById(R.id.reduce);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}//设置商品图片String imgUrl = goodsDetails.getProdImg();if(!imgUrl.isEmpty()){MyApplication.imageLoader.displayImage(imgUrl,holder.mGoodsIcon);}holder.mGoodsName.setText(goodsDetails.getProdName());holder.mGoodsPrice.setText("¥" + goodsDetails.getProdPrice());int num = goodsDetails.getProdCount();//当所点上商品数量为0时,隐藏“减”的图标if (num == 0){holder.mGoodsNum.setVisibility(View.GONE);holder.mGoodsReduce.setVisibility(View.GONE);}else {holder.mGoodsNum.setVisibility(View.VISIBLE);holder.mGoodsReduce.setVisibility(View.VISIBLE);}double totalPrice = num * Double.parseDouble(goodsDetailsList.get(position).getProdPrice());goodsDetails.setProdTotal(totalPrice);holder.mGoodsNum.setText(num + "");//设置加减监听事件holder.mGoodsReduce.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {id = goodsDetailsList.get(position).getProdId();count = goodsDetailsList.get(position).getProdCount();count --;goodsDetailsList.get(position).setProdCount(count);context.modifyGoodsNum(id,count);context.calculateTotalPrice();GoodsDetailsAdapter.this.notifyDataSetChanged();classifyAdapter.notifyDataSetChanged();}});holder.mGoodsAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {id = goodsDetailsList.get(position).getProdId();count = goodsDetailsList.get(position).getProdCount();count ++;goodsDetailsList.get(position).setProdCount(count);context.modifyGoodsNum(id,count);context.calculateTotalPrice();GoodsDetailsAdapter.this.notifyDataSetChanged();classifyAdapter.notifyDataSetChanged();}});return convertView;}class ViewHolder{private TextView mGoodsName;    //商品名称private TextView mGoodsNum;     //商品数量private TextView mGoodsPrice;   //商品单价private ImageView mGoodsIcon;   //商品图片private ImageView mGoodsAdd;    //增加private ImageView mGoodsReduce; //减少}
}

然后是购物车功能,其使用的是控件的visibility属性,进行显示与隐藏,背景是半透明#50000000。购物车对应的适配器CartAdapter,详细代码如下:

package com.example.henry.test.adapter;import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.example.henry.test.MainActivity;
import com.example.henry.test.R;
import com.example.henry.test.entity.GoodsDetails;import java.util.List;/*** Description:购物车的适配器* author: henry* Date: 16-4-21 下午5:36.*/
public class CartAdapter extends BaseAdapter {private MainActivity context;private List<GoodsDetails> list;private int num;public CartAdapter(MainActivity context,List<GoodsDetails> list){this.context = context;this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {final ViewHolder holder ;if (convertView == null){convertView = View.inflate(context, R.layout.listitem_goods_cart,null);holder = new ViewHolder();holder.mName = (TextView) convertView.findViewById(R.id.tv_name_cart);holder.mNum = (TextView) convertView.findViewById(R.id.tv_num_cart);holder.mPrice = (TextView)convertView.findViewById(R.id.price_cart);holder.mAdd = (ImageView)convertView.findViewById(R.id.add_cart);holder.mReduce = (ImageView) convertView.findViewById(R.id.reduce_cart);convertView.setTag(holder);}else {holder = (ViewHolder) convertView.getTag();}//初始化holder.mName.setText(list.get(position).getProdName());holder.mPrice.setText("¥" + list.get(position).getProdPrice());holder.mNum.setText(list.get(position).getProdCount() + "");//
//        double totalPrice = num * Double.parseDouble(list.get(position).getProdPrice());
//        list.get(position).setProdTotal(totalPrice);holder.mAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int count = list.get(position).getProdCount();count ++;list.get(position).setProdCount(count);context.modifyGoodsNum(list.get(position).getProdId(),count);context.calculateTotalPrice();notifyDataSetChanged();context.updateList(true,true,false);}});holder.mReduce.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int count = list.get(position).getProdCount();count--;if (count <= 0)count = 0;list.get(position).setProdCount(count);context.modifyGoodsNum(list.get(position).getProdId(),count);context.calculateTotalPrice();notifyDataSetChanged();context.updateList(true,true,false);}});return convertView;}class ViewHolder{private TextView mName;private TextView mPrice;private TextView mNum;private ImageView mAdd;private ImageView mReduce;}
}

MainActivity:

package com.example.henry.test;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;import com.example.henry.test.adapter.CartAdapter;
import com.example.henry.test.adapter.GoodsClassifyAdapter;
import com.example.henry.test.adapter.GoodsDetailsAdapter;
import com.example.henry.test.app.Constant;
import com.example.henry.test.entity.GoodsClassify;
import com.example.henry.test.entity.GoodsDetails;
import com.example.henry.test.function.AppUtility;
import com.example.henry.test.function.JsonUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;import org.json.JSONException;
import org.json.JSONObject;import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends Activity implements View.OnClickListener {private ListView mParentList;private ListView mChildList;private TextView mBill;private TextView mPrice;private TextView mCount;private ImageView mCart;private LinearLayout mWindow;private ListView mCartList;private TextView mClear;private View mView;private Boolean isShow = false;private List<GoodsClassify> classifys = new ArrayList<>();private List<GoodsDetails> detailses = new ArrayList<>();private List<GoodsDetails> list ;//  购物车中商品列表private CartAdapter cartAdapter;private GoodsClassifyAdapter classifyAdapter;private GoodsDetailsAdapter detailsAdapter;private static DecimalFormat df = new DecimalFormat("0.00");private int location = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ViewUtils.inject(this);setContentView(R.layout.activity_main);init();getGoodsData();}/*** 初始化控件,并设置监听事件*/public void init(){mParentList = (ListView)findViewById(R.id.parentlist);mChildList = (ListView) findViewById(R.id.childlist);mCount = (TextView) findViewById(R.id.tv_count);mBill = (TextView) findViewById(R.id.billing);mPrice = (TextView) findViewById(R.id.price_main);mCart = (ImageView) findViewById(R.id.cart);mWindow = (LinearLayout) findViewById(R.id.window);mCartList = (ListView) findViewById(R.id.list_cart);mClear = (TextView) findViewById(R.id.clear);mView = (View) findViewById(R.id.view);mBill.setOnClickListener(this);mCart.setOnClickListener(this);mClear.setOnClickListener(this);mView.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.billing:isShow = setWindowView(true);Intent intent = new Intent(this,BillActivity.class);Bundle bundle = new Bundle();bundle.putSerializable("LIST", (Serializable) list);intent.putExtras(bundle);startActivity(intent);break;case R.id.cart:isShow = setWindowView(isShow);createCartList();cartAdapter = new CartAdapter(MainActivity.this,list);mCartList.setAdapter(cartAdapter);break;case R.id.clear:clearList();break;case R.id.view:isShow = setWindowView(true);break;default:break;}}/**清空列表*/public void clearList(){for (int i=0;i<classifys.size();i++) {for (int j = 0; j < classifys.get(i).getProdList().size(); j++) {classifys.get(i).getProdList().get(j).setProdCount(0);}}createCartList();cartAdapter = new CartAdapter(MainActivity.this,list);mCartList.setAdapter(cartAdapter);updateList(true,true,false);mPrice.setText("¥" + df.format(0.00) + "元" );mCount.setVisibility(View.GONE);}/*** 刷新list,* @param flag  表示adapter,0代表classifyAdapter;1代表detailsAdapter;2代表cartAdapter;*/public void updateList(Boolean... flag){if (flag[0])classifyAdapter.notifyDataSetChanged();if (flag[1])detailsAdapter.notifyDataSetChanged();if (flag[2])cartAdapter.notifyDataSetChanged();}/*** 修改购物车显示状态,并返回修改后的状态* @param isShow 购物车详细信息是否显示* @return      购物车显示的当前状态  显示true,不显示为false*/public Boolean setWindowView(Boolean isShow){if (isShow == false){mView.setVisibility(View.VISIBLE);mWindow.setVisibility(View.VISIBLE);isShow = true;}else {mView.setVisibility(View.GONE);mWindow.setVisibility(View.GONE);updateList(true,true,false);isShow = false;}return isShow;}/*** 初始化列表*/public void initView(){if(classifys != null &&  classifys.size() != 0){//设置parentList 数据classifyAdapter = new GoodsClassifyAdapter(getApplicationContext(),classifys);mParentList.setAdapter(classifyAdapter);//设置childList 数据detailses.addAll(classifys.get(0).getProdList());detailsAdapter = new GoodsDetailsAdapter(MainActivity.this,detailses,classifyAdapter);mChildList.setAdapter(detailsAdapter);}mParentList.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {location = position;classifyAdapter.clearSelection(position);detailses.clear();detailses.addAll(classifys.get(position).getProdList());updateList(false,true,false);}});}/*** 计算总价与选中的个数,并显示在界面上*/public void calculateTotalPrice(){createCartList();int num = 0;double price = 0.00;for (int i=0;i<list.size();i++){num += list.get(i).getProdCount();price += Double.parseDouble(list.get(i).getProdPrice()) * list.get(i).getProdCount();}mPrice.setText("¥" + df.format(price) + "元" );if (num == 0){this.mCount.setVisibility(View.GONE);}else{this.mCount.setVisibility(View.VISIBLE);this.mCount.setText(num + "");}}/*** 创建购物车商品列表*/public void createCartList(){list = new ArrayList<>();for (int i=1;i<classifys.size();i++){for (int j=0;j<classifys.get(i).getProdList().size();j++){if (classifys.get(i).getProdList().get(j).getProdCount() > 0){list.add(classifys.get(i).getProdList().get(j));}}}}/*** 修改指定id的商品的数量* @param id* @param num*/public void modifyGoodsNum(String id,int num){for (int i=0;i<classifys.size();i++){for (int j=0;j<classifys.get(i).getProdList().size();j++){if (id.equals(classifys.get(i).getProdList().get(j).getProdId())){classifys.get(i).getProdList().get(j).setProdCount(num);}}}}/*** 从服务器获取商品数据*/private void getGoodsData() {RequestParams params = new RequestParams();HttpUtils http = new HttpUtils();http.send(HttpRequest.HttpMethod.POST, Constant.URL, params, new RequestCallBack<String>() {@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) {try {JSONObject result = new JSONObject(responseInfo.result);if (AppUtility.getStatus(getApplicationContext(), result)) {classifys = JsonUtils.getGoodsList(result);initView();} else {}} catch (JSONException e) {e.printStackTrace();}}@Overridepublic void onFailure(HttpException e, String s) {}});}
}

以上是代码的主体部分,MainActivity与3个适配器之间的相互调用,从而实现数据的同步。不怎么会讲,光看一个也看不懂,下面我会附上源码地址。希望大神门批评指正。

源码地址:http://download.csdn.net/detail/henry__mark/9505520;

两个ListView实现的Android点餐页面相关推荐

  1. Android 一个页面上下两个ListView的页面显示

    Android 一个页面上下两个ListView,当上面的ListView过长时,下面的List基本没有了滑动空间,查阅网上资料,解决办法基本是采用ScrollView做页面滑动,notifyData ...

  2. Android 两个ListView联动,仿电影展示界面

    Android 两个ListView联动,仿电影展示界面 需要导入的依赖包: compile 'com.squareup.picasso:picasso:2.5.2' compile 'io.reac ...

  3. android 仿美团联动,仿美团弹出分类选择框(左右两个listview联动)

    [实例简介] 左边产品大类,选择某一类后在右边展开其中的小类,用两个listview联动实现 [实例截图] [核心代码] 1535269showPopWindow └── showPopWindow ...

  4. android listview divider color,android listview 属性

    1. 背景色: listView设置背景色android:background="@drawable/bg",拖动或者点击list空白位置的时候发现ListItem都变成黑色. 因 ...

  5. 罗升阳:那两年炼就的Android内功修养

    [置顶] 那两年炼就的Android内功修养 原文链接:http://blog.csdn.net/luoshengyang/article/details/8923485 经过两年的时间,终于完成对A ...

  6. listview控件Android,Android中ListView控件的简单使用

    文章引自郭霖<第一行代码> ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕 使用LIstView控件 1 在布局文件中引入Li ...

  7. Android安卓餐盘颜色识别快餐计费解决方案源码

    Android安卓餐盘颜色识别快餐计费解决方案源码 最近了解到一个项目需要识别餐盘.在人工智能发展到的今天识别菜品确实没有问题,但是对于实际商用就会涉及到较多问题,比如:1.虽然菜品已经有成熟训练模型 ...

  8. Android注册登录页面

    Android注册登录页面 需求 分析 项目目录 .java domain JsonBean.java UserInfo.java utils GetJsonDataUtil.java Login.j ...

  9. 调试Android和iOS页面

    1.Chrome DevTools远程调试Android和iOS页面 电脑上安装新版谷歌浏览器,然后地址栏输入chrome://inspect会打开设备监视页面,这里可以监视到iOS和Android设 ...

最新文章

  1. 案例 | 蓝天智通:智办事助力“智慧校园”数智化管理,提升人效
  2. spring三大核心学习
  3. vux 地图插件_基于vue的移动端组件vux的安装及使用
  4. 英特尔发布其首个适配Win11的显卡驱动
  5. 刚到的新公司 前任经理匆匆见了一面 飞鸽传书下载
  6. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法
  7. 麦咖啡Agent安装完后不合图标和不马上在EPO服务器上显示客户端的问题
  8. win10虚拟桌面使用方法-提高工作效率
  9. java继承 后的方法_Java 继承
  10. java socket 断开连接_Socket.IO-client.java重复断开连接并重新连接
  11. Atitit 摄像头与主机连接方式大总结
  12. 数据分析|WordCloud PCA K-means - 「某电商平台」电脑评论分析
  13. 中国电信物联网开放平台对接历程
  14. 美军与敏捷领导力—八个改变工作方式世界的老兵
  15. 通过网站端口攻击服务器,服务器被攻击怎么解决?从端口策略入手
  16. Playing with ptrace原文
  17. 如何让用html制作404页面,网站404页面怎么做?
  18. 中国象棋(Java版)
  19. [C]奶牛生奶牛问题
  20. UVA 1455 Kingdom 线段树+并查集

热门文章

  1. Cocos2d python
  2. 快速复制蜜芽商城多个商品主图及细节图保存
  3. 将物流行业送往智能时代,菜鸟网络的配送车已经上路了
  4. Unity自由涂鸦轨迹检测(VR)
  5. openofdm中complex_to_mag的分析
  6. C++课后习题(一)
  7. 是一个新的开始,还是冥冥之中已经在路上。
  8. 科技云报道原创:没有一个行业,能拒绝“通信中台”的诱惑
  9. ABF平台设计(三)-优酷中后台低代码开发方案
  10. 关于Vivado实现远程下载bit文件