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

首先,其实Listview中Button按钮点击事件冲突这种问题压根就不是太大的问题,因为我们完全可以将一个TextView的Backgroud设置成一个selector,也可以将一个TextView设计成一个按钮的样子,这样就可以绕过ListView和Button的冲突问题!

当然,如果非要使用Button,那可以利用以下方案解决。

首先,要了解的是,ListView和其它能触发点击事件的widget无法一起正常工作的原因是加入其它widget后,ListView的itemclick事件被其它widget的click事件屏蔽,所以将无法触发。

如何做呢?

定义list_item_btn.xml:

<?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"android:orientation="horizontal" ><ImageViewandroid:id="@+id/avatar"android:layout_width="80dp"android:layout_height="80dp"android:src="@drawable/ic_launcher" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="10dp" ><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:padding="6dp"android:text="玫瑰花园"android:textSize="16sp" /><Buttonandroid:id="@+id/btn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="2dp"android:focusable="false"android:padding="6dp"android:text="玫瑰花园"android:textSize="16sp" /></LinearLayout></LinearLayout>

注; Button的android:focusable必须设置为false,以免它抢了父控件(也就是每一个Item)的焦点。

接下来,我们定义一个Bean,Plan.java:

public class Plan {public String name;public String avatar;public Plan(String name, String avatar) {super();this.name = name;this.avatar = avatar;}@Overridepublic String toString() {return "Plan [name=" + name + ", avatar=" + avatar + "]";}}

实现ListView的Adapter,MyAdapter.java:

package com.wuyuan.listbtn;import java.util.List;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;public class MyAdapter extends BaseAdapter {private Context mContext;private LayoutInflater mInflater;private List<Plan> mDatas;private OnClickListener onClickListener;public MyAdapter(Context context, List<Plan> datas,OnClickListener onClickListener) {mContext = context;mInflater = LayoutInflater.from(mContext);mDatas = datas;this.onClickListener = onClickListener;}@Overridepublic int getCount() {return (mDatas != null ? mDatas.size() : 0);}@Overridepublic Object getItem(int position) {return (mDatas != null ? mDatas.get(position) : null);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {// 下拉项布局convertView = mInflater.inflate(R.layout.list_item_btn, null);holder = new ViewHolder();holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);holder.title = (TextView) convertView.findViewById(R.id.title);holder.btn = (Button) convertView.findViewById(R.id.btn);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}Plan plan = mDatas.get(position);if (plan != null) {holder.title.setText(plan.name);// 通常将position设置为tag,方便之后判断点击的button是哪一个holder.btn.setTag(position);holder.btn.setOnClickListener(this.onClickListener);}return convertView;}static class ViewHolder {ImageView avatar;TextView title;Button btn;}}

注:

1. 构造方法中,我们传入了OnClickListener,主要是为了让每一个Item的Button监听该事件.

2. holder.btn.setOnClickListener(this.onClickListener); 为Button设置点击事件监听。

3. 为Button设置tag,tag的值为position,这样可以方便获取该Button所在的List中的位置。

最后,设置列表及事件监听:

public class MainActivity extends Activity {private ListView list_view;private List<Plan> plans;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list_view = (ListView) findViewById(R.id.list_view);plans = new ArrayList<Plan>();for (int i = 0; i < 10; i++) {plans.add(new Plan("无缘公子-宁帅" + i, ""));}MyAdapter mAdapter = new MyAdapter(this, plans,onClickListener);list_view.setAdapter(mAdapter);list_view.setOnItemClickListener(new OnItemClickHandler());}private class OnItemClickHandler implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {System.out.println(" position1 :" + position);System.out.println(" data1 :" + plans.get(position).toString());}}private OnClickListener onClickListener = new OnClickListener() {@Overridepublic void onClick(View view) {Button btn = (Button) view;int pos = (Integer) btn.getTag();System.out.println(" position2 :" + pos);System.out.println(" data2 :" + plans.get(pos).toString());}};
}

源码下载地址(免费): http://download.csdn.net/detail/zuiwuyuan/9192201

转载于:https://www.cnblogs.com/hehe520/p/6329959.html

Android Listview中Button按钮点击事件冲突解决办法相关推荐

  1. button layui 点击事件_解决layui中的form表单与button的点击事件冲突问题

    解决layui中的form表单与button的点击事件冲突问题 layui的form表单位置和button标签的位置重合,会使得button的click事件得不到响应,如图: 蓝色底为form的位置, ...

  2. java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...

    我想使用java脚本为header中的按钮创建一个处理程序.下面我视图模型给出:如何为odoo 10中的按钮点击事件添加一个java脚本处理程序? inherit_id="web.asset ...

  3. matlab中run按钮是灰色的,Android Studio中Run按钮是灰色的快速解决方法

    首先是,在不同的AS中,gradle版本不同,下载的sdk版本不同,这些,都在gradle(Project.Models)相关代码里调过来就好.之前的文章里有说过. 经过调好gradle这些文件,AS ...

  4. Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

    bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore ...

  5. android studio listview点击事件,android如何响应listview上不同按钮点击事件

    参考来源:http://www.tuicool.com/articles/bamqiq 大致思路:重写适配器,让主函数继承接口接口 ListItemClickHelp,这个接口中包含onclick方法 ...

  6. 在html中搜索按钮事件,html中button绑定点击事件的几种方法介绍

    HTML中为button绑定事件的方式有三种. 例如以下标签: submit 一.使用jquery进行绑定$('#btn_submit').click(function(){ }); 二.使用原生js ...

  7. Android监听button按钮的click事件

    方式一: 提供所有按钮监听事件入口,在OnClick方法中通过View.getId()获取到发生点击事件的按钮Id,再进行相应的处理, 在页面有多个按钮的情况下比较适用. package com.ex ...

  8. layui中实现按钮点击事件

    首先,小编要告诉大家一个残酷的现实,那就是小编没有找到layui对点击事件的支持- 这里的点击事件是指单纯的点击事件,而不是提交事件,或者是数据表格中内嵌的button,对于这两者,layui是有la ...

  9. Android应用中捕捉所有点击事件实现

    一.思路 (1)获取Activity对象: (2)遍历所有子控件: (3)注册点击事件. 二.实现 (1)获取Activity对象 activity对象的获取可以考虑多个方面,从两个方面进行选择: ① ...

最新文章

  1. linux vi 清除所有,Vi命令:如何删除全部内容
  2. springboot配置内部配置类
  3. linux vnc xstartup,vnc 远程桌面选择的配置 xstartup
  4. 404. Sum of Left Leaves 左叶子之和
  5. 3、AngularJS2 架构
  6. bottle模板中的替换
  7. 图片底下配的文字叫什么_PPT排版狂想篇 | 如何用一张图片搞定30种排版
  8. 计算机工程主编陶小雪,城市环境所在MOFs基催化剂的制备和VOCs催化氧化方面取得进展...
  9. 黑莓9810JAVA,黑莓9810 中文刷机包
  10. 怎么用计算机求正切值的角度,在excel中如何使用正切函数计算,excel函数tan怎么反算角度...
  11. [Python黑帽] 二.Python能做什么攻击?正则表达式、网络爬虫和套接字通信入门
  12. 用艾宾浩斯曲线记忆周期来背单词是否有理论依据?
  13. This computer does not support Intel Virtualization Technology (VT-x) or it is being exclusively use
  14. A-MPDU与A-MSDU各是什么意思
  15. 如何禁止Windows Defender自动扫描
  16. 天梯赛--清点代码库
  17. Linux 安装VMware Tools(open-vm-tools)实现桌面全屏、跨平台复制等功能
  18. 2021-2022学年广州市番禺华附九年级第一学期期中考试英语试题
  19. 压缩算法——谷歌Webp
  20. Android官方实现的层次状态机Hierarchical State Machine源代码

热门文章

  1. php标签调用,phpcms栏目标签调用代码大全
  2. .NET平台功能最强大,性能最佳的JSON库
  3. 收集Linux常用命令
  4. 身份证号码有效性检测算法 ( js版 转 C#版 )
  5. es查询大文本效率_es之路由:进一步提高Elasticsearch的检索效率(适用大规模数据集)...
  6. 带wiringPi库的交叉编译
  7. 60度斜坡怎么计算_【测绘】南方CASS土方计算方法—方格网法
  8. Array.prototype.reduce 的理解与实现
  9. 【转】Java开发必须要知道的知识体系
  10. Rafy 框架 - 幽灵插件(假删除)