PS:长时间不写博客了,今天来写一下美团的这个点餐界面,今天先写一个加号减号的接口调用,下一篇是整体,有点菜,评价,商家,还有左边的listview和右边的展示项。进入这篇正题,像listview,GridView等这些view都有写好的一些点击监听,但有些并不是咱们想要用到的,比如说listview内部有按钮,咱们要点击,而且还要在该item项上做一些操作,比如说数字加减并显示在页面上,实时显示。这就用到了今天的内部点击事件的回调,当然这只是一种方法,也可能有其他更简单的方法。今天就主要说一下类似于美团的加减餐数量的回调。

美团图:

这个图是比较好看的,今天所写的代码就不如这个了,主要是说回调

步骤

  1. 主布局里面只有一个listview控件
  2. item布局样式
  3. 自定义适配器的创建
  4. activity中回调方法

1:第一步

主布局里添加一个listview,这个就省略了。

2:item布局样式

布局也是简单的,这里的加号和减号,我没有给大家把图片给大家,随便一个图片即可,就算没有图片一个btn也是可以的

这里的左边一个textview   ,左右分别是加号和减号,还有一个num(textview)显示。

  1. <TextView
  2. android:id="@+id/id_lv_name"
  3. android:layout_width="0dp"
  4. android:layout_height="wrap_content"
  5. android:text="火腿"
  6. android:layout_marginLeft="5dp"
  7. android:layout_gravity="center|left"
  8. android:textSize="20dp"
  9. android:layout_weight="0.7"/>
  10. <ImageView
  11. android:id="@+id/id_lv_minus"
  12. android:layout_width="0dp"
  13. android:layout_height="wrap_content"
  14. android:src="@drawable/btnminus"
  15. android:layout_weight="0.1"/>
  16. <TextView
  17. android:id="@+id/id_lv_num"
  18. android:layout_width="0dp"
  19. android:layout_height="match_parent"
  20. android:text="1"
  21. android:textSize="20dp"
  22. android:gravity="center"
  23. android:layout_weight="0.1"/>
  24. <ImageView
  25. android:id="@+id/id_lv_add"
  26. android:layout_width="0dp"
  27. android:layout_height="wrap_content"
  28. android:src="@drawable/btnadd"
  29. android:layout_weight="0.1"/>

3:自定义适配器的创建

这个是关键,里面需要有自定义的接口用作回调。

这里面有一个类Item,就是一个实体类,里面只有name和num,和setget方法。具体看注释。

3.1首先自定义一个adapter,重写里面的一些方法即可,这里是局部代码。

  1. public class MyAdapterListView extends BaseAdapter {
  2. public Context context;
  3. public List<Item> list;
  4. private int num1;
  5.  
  6. public MyAdapterListView(Context context, List<Item> list) {
  7. this.context = context;
  8. this.list = list;
  9. }

 3.2 主要是getview方法,这里是又写了一个ViewHolder类。

  1. public View getView(final int i, View view, ViewGroup viewGroup) {
  2. // int num=0;
  3. if(view == null){
  4. view=LayoutInflater.from(context).inflate(R.layout.lv_item,null);
  5. viewHolder=new ViewHolder();
  6. viewHolder.name= (TextView) view.findViewById(R.id.id_lv_name);
  7. viewHolder.minus= (ImageView) view.findViewById(R.id.id_lv_minus);
  8. viewHolder.numText= (TextView) view.findViewById(R.id.id_lv_num);
  9. viewHolder.add= (ImageView) view.findViewById(R.id.id_lv_add);
  10. view.setTag(viewHolder);
  11. }
  12. viewHolder= (ViewHolder) view.getTag();
  13. viewHolder.name.setText(""+list.get(i).getName());
  14. viewHolder.numText.setText(""+list.get(i).getNum());

 3.3 重点来了创建接口,这里定义了一个方法,需要传入textview控件和  position,和加号(减号)改变的数据。

  1. //定义接口
  2. public interface OnMyItemClickListener{
  3. //ID , 数量
  4. void onBtnItemListener(TextView tv, int i, int num);
  5. }
  6. public OnMyItemClickListener onMyItemClickListener;
  7. public void setOnMyItemClickListener(OnMyItemClickListener onMyItemClickListener){
  8. this.onMyItemClickListener=onMyItemClickListener;
  9. }

  3.4:加号和减号用法// num1 = 0; 加减号 使用接口

  1. viewHolder.minus.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. num1 = list.get(i).getNum();//获取到(减号)改动过的 数量
  5. num1 = num1 -1;
  6. if(num1 <=0){//逻辑判断,如果减为0的话,就一直为0,要不然就是符号了。
  7. num1 =0;
  8. }
  9. onMyItemClickListener.onBtnItemListener(viewHolder.numText,i, num1);//使用刚才自定义的接口。
  10. }
  11. });
  12. viewHolder.add.setOnClickListener(new View.OnClickListener() {
  13. @Override
  14. public void onClick(View view) {
  15. num1 = list.get(i).getNum();//获取到(加号)改动过的 数量
  16.           num1++;
  1.         viewHolder.numText.setText(num1 +""); onMyItemClickListener.onBtnItemListener(viewHolder.numText,i, num1); } });

4:activity中回调方法

  1. 主要还是调用Adapter中创建的接口,然后使用的时候再获取改变的num值,然后通过listData.get(i).setNum(num)修改该id的数据,然后让适配器更新一下。
  1. Item item;
  2. for (int i = 0; i < 30; i++) {
  3. item = new Item();
  4. item.setName("ceshi" + i);
  5. item.setNum(0);
  6. listData.add(item);
  7. }
  8. myAdapterListView = new MyAdapterListView(this, listData);
  9. listview.setAdapter(myAdapterListView);//接口回调adapter中的方法,修改值以后再返回数据,更新适配器
  10. myAdapterListView.setOnMyItemClickListener(new MyAdapterListView.OnMyItemClickListener() {
  11. @Override
  12. public void onBtnItemListener(TextView tv, int i, int num) {
  13. // Toast.makeText(MainActivity.this, "第:"+i+" 个---"+num, Toast.LENGTH_SHORT).show();
  14. listData.get(i).setNum(num);
  15. myAdapterListView.notifyDataSetChanged();
  16. }
  17. });

  

完。  

  

美团点餐—listview内部按钮点击事件的更多相关文章

  1. 22 Notification样式设置内部按钮点击事件

    package com.exam1ple.demo1; import android.app.Activity; import android.app.NotificationManager; imp ...

  2. 在Activity中响应ListView内部按钮的点击事件

    最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter中定义一个回调接口,在A ...

  3. 在Activity中响应ListView内部按钮的点击事件的两种方法!!!

    在Activity中响应ListView内部按钮的点击事件的两种方法 转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题: ...

  4. 在Activity中响应ListView内部按钮的点击事件的两种方法

    转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在 ...

  5. Android Listview中Button按钮点击事件冲突解决办法

    今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...

  6. Objective-C:模拟按钮点击事件理解代理模式

    OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...

  7. js触发按钮点击事件

    js触发按钮点击事件 博客分类: javascript   模拟JS触发按钮点击功能 <html> <head> <title>usually function&l ...

  8. 按钮点击事件,打开新的Activity

    按钮点击事件,打开新Activity, 打开网页 findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener ...

  9. Javascript之三种按钮点击事件

    学习Javascript必须要先掌握基本的事件方法和语法,这些都是我们学过的也是最基本的.以前忘了总结,所以现在回顾,综合地总结一下,温故而知新. Javascript有三种按钮点击事件,分别为ale ...

随机推荐

  1. iBrand 教程 0.1:Windows + Homestead 5 搭建 Laravel 开发环境

    统一开发环境 为了保证在学习和工作过程中避免因为开发环境不一致而导致各种各样的问题,Laravel 官方为了我们提供了一个完美的开发环境 Laravel Homestead,让我们无需再本地安装 PH ...

  2. PHP Curl会话请求

    /** * @param string $url 请求地址 * @param string $type 请求类型 post get * @param string $arr 如果是post 传递的数据 ...

  3. 8Manage:专注企业级CRM服务应用

    [导读]经过过去一段时间的资本寒冬,中国的企业服务市场热度渐退,开始步入平稳的发展阶段.面对中国越来越多企业的管理需求,这片具有巨大的发展空间的市场蓝海.我们应该如何面对企业客户CRM的需求,并将其更 ...

  4. 利用Cglib实现AOP

    前文讲了, 可以利用Spring, Guice等框架提供的容器实现AOP, 如果想绕过容器, 直接注入Class, 可以利用Cglib为对象加上动态代理,实现代码切入, 但是每次调用比较繁琐, 因此我 ...

  5. Oracle用户、授权、角色管理

    创建和删除用户是Oracle用户管理中的常见操作,但这其中隐含了Oracle数据库系统的系统权限与对象权限方面的知识.掌握还Oracle用户的授权操作和原理,可以有效提升我们的工作效率. Oracle ...

  6. mui实现切换选项卡

    mui切换选项卡头目对应选项内容是webAPP应用最多的功能 引入mui文件: 引入mui-segmented-control类实现顶部头目: 引入mui-content-padded类加入各选项卡内 ...

  7. Loadrunner11不能调用IE8解决方法大全

    刚安装了英文版的Loadrunner 11, 用的是IE8, 开始录制时没有启动IE, 试了网上很多的方法,最终解决了问题.总结一般产生问题的原因如下. 1.当你主机上有多个浏览器时,loadrunn ...

  8. docker学习系列(五):使用docker创建集成服务--lnmp

    在掌握了docker的基本命令之后,我也是想着去用docker做一点实际的配套环境,就拿自己最常用的lnmp环境来做测试.配套环境运行的顺序依次是mysql->php->nginx,至于为 ...

  9. Java使用对象流读取文件的问题

    把对象进行持久化(把对象存到本地)要用到对象流进行处理,在用对象流处理过程中,在写对象和读对象时候遇到了很多问题,分享一下. 我们处理对象数据的时候不可能只处理一个对象,在系统运行的时候,可能产生的对 ...

  10. 笔记:I/O流-内存映射文件

    内存映射文件时利用虚拟内存实现来将一个文件或者文件的一部分映射到内存中,然后整个文件就可以当作数组一样的访问,这个比传统的文件操作要快得多,Java 使用内存映射文件首先需要从文件中获取一个chann ...