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

时间:2022-12-21 19:01:53

今天做项目时,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" > <ImageView
android:id="@+id/avatar"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_launcher" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp" > <TextView
android: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" /> <Button
android: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;
} @Override
public 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;
} @Override
public int getCount() {
return (mDatas != null ? mDatas.size() : 0);
} @Override
public Object getItem(int position) {
return (mDatas != null ? mDatas.get(position) : null);
} @Override
public long getItemId(int position) {
return position;
} @Override
public 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; @Override
protected 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 { @Override
public 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() { @Override
public 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

Android Listview中Button按钮点击事件冲突解决办法的更多相关文章

  1. Android&comma;LIstView中的OnItemClick点击无效的解决办法

    在List_Item布局文件中的根节点加上如下背景标黄的这一行 <?xml version="1.0" encoding="utf-8"?> &lt ...

  2. GridView的点击事件冲突解决

    在开发的时候,常常可能遇到ListView或GridView控件点击事件与Item点击事件冲突的问题.原因是Item布局中的button或ImageButton强制获取了item的焦点,解决方案之中的 ...

  3. form表单中button按钮返回上一页解决办法

    解决Form中button按钮不好用的问题解决办法. 方法一: 1.在Form表单标签中国增加一个属性,如下图,红框处 2.返回按钮样式 3.onclick方法需要跳转的页面,遮挡处为需要返回的页面 ...

  4. android ListView中button点击事件盖掉onItemClick解决办法

    ListView 1.在android应用当中,很多时候都要用到listView,但如果ListView当中添加Button后,ListView 自己的 public void onItemClick ...

  5. android ListView中含有按钮事件实时更新ListView数据案例

    1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...

  6. ListView中嵌套GridView点击事件

    做一个项目时,需要在ListView中嵌套GridView,因为ListView的每个条目中不一定出现GridView,那么问题来了,添加GridView的Item的点击事件后,有GridView出现 ...

  7. xamarin&period;android listview绑定数据及点击事件

    前言 listview是用来显示数据列表的一个控件,今天给大家带来如何使用cursor进行数据绑定以及点击事件. 导读 1.如何创建一个listview 2.如何使用cursor进行绑定数据 3.li ...

  8. Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案

    为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; ...

  9. Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

    本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...

随机推荐

  1. 【转】Asp&period;net关闭弹出窗口刷新父窗口

    通常情况下,关闭窗口时不需要对父窗口做任何操作,但如果子窗口是某一对象的修改画面,这时,当关闭子窗体时就需要对父窗口刷新,刷新可以通过三种方式来实现:1,采用window.opener.locatio ...

  2. JSTL的fn函数

    JSTL使用表达式来简化页面的代码,这对一些标准的方法,例如bean的getter/setter方法,请求参数或者context以及session中的数据的访问非常方便,但是我们在实际应用中经常需要在 ...

  3. 演示Android百度地图操作功能

    在本文中将演示百度地图的操作功能,包括缩放,旋转,视角切换,点击,双击,长按事件触发的操作以及截图等.百度地图本来就内置有缩放,旋转功能,那么在这里,截图(其实很多手机也自带截图功能)以及点击事件的监 ...

  4. 和View Controllers一起工作

    在这一课中,你会继续在FoodTracker菜谱的场景工作.你会重新安排现有的UI元素并使用图像采集器添加到照片用户界面.当你完成,你的应用程序将是这个样子: 学习目标 在课程结束时,你将能够: 了解 ...

  5. 创建一个struts2的HelloWorld

    1.下载struts2的jar包 http://struts.apache.org/download.cgi#struts255 下载一个稳定版本Struts 2.3.31 里面提供了maven ja ...

  6. &lbrack;收藏转贴&rsqb;构建RESTful风格的WCF服务

    RESTful Wcf是一种基于Http协议的服务架构风格. 相较 WCF.WebService 使用 SOAP.WSDL.WS-* 而言,几乎所有的语言和网络平台都支持 HTTP 请求. RESTf ...

  7. TCP&sol;IP详解之:IP选路 动态选路协议

    第九章 IP选路 netstat -rn 显示路由表 初始化路由表的两种方法: 方法1:在配置文件中指定静态路由(不常用) 方法2:运行路由守护程序 或者 使用ICMP路由器发现报文 没有到达目的地的 ...

  8. Hibernate 1、Hello Hibernate

    所使用到的jar 包: 1.创建实体类 public class User { private Integer id; private String name; private String addr ...

  9. JS中的六大数据类型

    js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object). typeof 操作符 由于js中的变量是松 ...

  10. C&num;多线程更新,查询MongoDB数据

    对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(lock)的用法. 这次在做数据分析是需要将访问的url中host部分记录,如果已经存在就直接匹配id,没 ...