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

  今天做项目时,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

前言以前.NetCore是不内置JSON库的&#xff0c;所以大家都用Newtonsoft的JSON库&#xff0c;而且也确实挺好用的&#xff0c;不过既然官方出了标准库&#xff0c;那更方便更值得我们多用用&#xff0c;至少不用每次都nuget安装Newtonsoft.Json库了。不过日常开发使用中会有一些…

Android开发之运行客户的Demo拿不到数据

1、问题 自己照着客户的Demo写发现拿不到数据&#xff0c;很奇怪&#xff0c;检查不出哪里有问题2、思考 我自己写的东西和Demo本质上没有区别&#xff0c;但是就是拿不到数据&#xff0c;这尴尬了&#xff0c;后面发现我是在onCreate里面直接初始化然后马上调用&#xff0c;客…

C#系统开发登录窗体在MDI窗体之前显示

通常,系统运行时的启动窗体是MDI窗体,起作用的是main()函数的Application.Run(new Mdi())语句,但我们的效果是先显示登录窗体,再显示Mdi窗体。此时,如果将该句改为Application.Run(new Login()),运行时虽可出现登录窗体Login,但Mdi窗体会闪一下然后隐藏。解决办法: …

python测试之道pdf百度云_Python测试之道——笔记1

引言如果利用python做自动化测试的话&#xff0c;一些python相关的基础知识是必须要掌握的。常用的比如&#xff1a;python代码规范、变量与数据类型、运算、函数和字符串处理等。语法规范这里只介绍重点和常用的一些注意事项。在使用python编码的时候&#xff0c;我们应该严格…

libcurl实现解析(3) - libcurl对select的使用

1.前言 在本系列的前一篇文章中。介绍了libcurl对poll()的使用。參考"libcurl原理解析(2) - libcurl对poll的使用"。 本篇文章主要分析curl_poll()中对select()的封装使用。与前一篇类似&#xff0c;我们仅仅分离出与select相关的代码。 2.curl_poll函数分析 这个函数…

C#子窗体运行时无法正常最大化的解决办法

通常情况下,要是一个窗体运行时最大化,最简单的做法就是鼠标捏一下将窗体的WindowState属性设为Maximized。但要是一个窗体是MDI的子窗体的话,以上做法就失灵了!这是我们就选择用代码控制,示例代码如下: Education_Train TE = new Education_Train(); TE.MdiParent = thi…

C和指针之高级指针话题通过函数指针实现在链表中找到特定的值

1、问题 通过函数指针实现在链表中找到特定的值,这里可以是int 类型或者char *类型 思路: 整形数据自己写比较函数,字符串比较用strcmp,然后把这个函数指针传递到函数作为参数。 2、代码实现 #include <stdio.h> #include <string.h>typedef struct No…

internet访问局域网内部方法之----------路由器端口映射

很多人每天都问为什么要端口映射&#xff1f;例如:通过路由器上网的&#xff0c;网站自己可以访问&#xff0c;但是别人就不能&#xff1b;输入127.0.0.1可以访问&#xff0c;别人还是看不到&#xff1b;输入localhost可以看到&#xff0c;但是别人就是看不到&#xff0c;气人啊…

Xamarin效果第四篇之CollectionView子项右侧布局

前面基于PopupPage然后实现了手机底部弹窗;今天再次基于他从手机右侧弹出一个可以交互的窗口;直接看看最终实现的效果:右侧弹窗不是重点主角是排行榜:我还是直接使用CollectionView然后对于头像那一块还是CollectionView然后通过修改他的子项和Header模板然后旋转让子项从右侧布…

由于TempDB设置错误导致SQL Server无法重启错误的解决方案

场景&#xff1a;前几天接到一个朋友的电话&#xff0c;说他们由于将TempDB设置错误导致SQL Server无法重启&#xff0c;让我帮忙看看。他们本来是想将TempDB的文件挪动到其他路径,比如准确的脚本应该是&#xff1a; USE master GO ALTER DATABASE tempdb  MODIFY FILE (…

知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...

为什么是Python先来聊聊为什么做数据分析一定要用 Python 或 R 语言。编程语言这么多种&#xff0c; Java , PHP 都很成熟&#xff0c;但是为什么在最近热火的数据分析领域&#xff0c;很多人选择用 Python 语言&#xff1f;数据分析只是一个需求&#xff0c;理论上来讲&#x…

判断一个偶数(大于4)是不是两个素数之和

问题:编制具有如下原型的函数sushu(int n),用来判断整数n是否为素数; 而后编制主函数,任意输入一个大于4的偶数d,找出满足d=d1+d2的所有数对,其中要求d1与d2均为素数(通过调用sushu函数来判断素数)。如偶数18可以分解为11+7以及13+5;而偶数80可以分解为:43+37、61+19、…

C和指针之动态内存分配堆、栈、全局区(静态区)、常量区对比总结学习笔记

一、各个区的介绍 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是…

.NET 6 使用 string.Create 提升字符串创建和拼接性能

本文告诉大家&#xff0c;在 dotnet 6 或更高版本的 dotnet 里&#xff0c;如何使用 string.Create 提升字符串创建和拼接的性能&#xff0c;减少拼接字符串时&#xff0c;需要额外申请的内存&#xff0c;从而减少内存回收压力本文也是跟着 Stephen Toub 大佬学性能优化系列博客…

java读取csv文件

2019独角兽企业重金招聘Python工程师标准>>> CSV其实就是COMMA SEPARATED VALUE的缩写。在开发中用Java操作csv文件有专门的的API叫javacsv.jar javacsv.jar下载地址&#xff1a; http://sourceforge.net/project/showfiles.php?group_id33066 package com.syc.tes…

python中plt.hist_关于python中plt.hist参数的使用详解

python matplotlib hist堆积直方图&#xff1f;可以帮小编实现下面两张图的代码吗与怪物战斗的人&#xff0c;应当小心自己不要成为怪物。当你远远凝视深渊时&#xff0c;深渊也在凝视你。from sklearn.datasets import load_iris import matplotlib.pyplot as plt iris load_…

两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)

本篇文章主要介绍了"两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)"&#xff0c;主要涉及到两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)方面的内容&#xff0c;对于两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)感兴趣的同学可…

子窗体菜单合并到父窗体菜单的解决办法

系统中既有父窗体又有子窗体&#xff0c;子窗体添加下拉菜单&#xff0c;运行时子窗体的菜单会合并到父窗体的菜单中&#xff0c;解决办法是&#xff0c;将子窗体菜单控件的AllowMerge属性设为false。

C和指针之预处理器之普通c/c++文件的编译过程

1、简单总结c/c++文件的编译3个过程 1)、预处理器进行预编译 比如我们测试这段代码 #include <stdio.h>int main() {printf("hwllo word\n");return 0; } 主要做的事情是: (1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换 (2)处理所…

Android笔记:Activity

1.Android可视化界面结构: 一个Android应用的可视化界面最底层是Activity,在他之上是一个Window对象,在window之上通常是布局容器,再上面才是用户直接交互的组件(按钮,文本框)交互组件(UI控件)-->布局容器(layout)--->Window对象--->Activity2.Activity生命周期 …