今天做项目时,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,LIstView中的OnItemClick点击无效的解决办法

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

  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.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. java根据list中的对象某个属性排序

    1. Collections.sort public class Test { public static void main(String[] args) throws Exception { Ci ...

  2. day37 06-Hibernate二级缓存:更新时间戳区

    二级缓存区:类缓存区,集合缓存区,更新时间戳区. 它会记录一个时间T1.其实在我们查询之后它会记录一个时间.假设时间叫做T1.就是你查询完之后的当前时间是T1.当我们自己手动在下面做了一个更新之后,它 ...

  3. js判断类型为数字的方法实现总汇——原生js判断isNumber()

    方法一[推荐]: 最容易想到的是用typeof来判断是否是number类型 ,但是如果为NaN会被认为也是number类型,因此我们需要使用isNaN来排除NaN的情况. function isNum ...

  4. php rmdir使用递归函数删除非空目录的方法

    php rmdir()函数 rmdir ― 删除空目录 语法: bool rmdir ( string $dirname [, resource $context ] )尝试删除 dirname 所指 ...

  5. QLabel添加Click信号

    使用自定义label来实现此功能 其他控件可参照此例. #include "customerqlabel.h" CustomerQlabel::CustomerQlabel(QWi ...

  6. bash 小技巧

    CTRL-R (reverse find),按下之后敲几个字母就能在最近打过的命令里搜索.

  7. Directx11教程(31) 纹理映射(1)

    原文:Directx11教程(31) 纹理映射(1)         在前面的例子中,我们要么是直接给顶点赋颜色值,要么是在顶点属性中设置Diffuse和Specular系数,从而根据光照参数计算得到 ...

  8. iOS将image转90,180,270度的方法

    http://blog.sina.com.cn/s/blog_6602ffbc0101ckx3.html 这里要分享的是将image旋转,而不是将imageView旋转,原理就是使用quartz2D来 ...

  9. 使用Velero Restic快速完成云原生应用迁移至ACK集群

    本文记录使用Velero Restic快速完成云原生应用迁移至ACK集群的实践过程. 0. 实践步骤概览 (1)创建GKE集群(或自建Kubernetes集群)(2)在GKE集群上部署示例应用Jenk ...

  10. 【C++】判断一个图是否有环 无向图 有向图(转载)

    没有找到原文出处,请参考一下链接: http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.html http://topic.csdn.ne ...