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" > <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按钮点击事件冲突解决办法的更多相关文章
- Android,LIstView中的OnItemClick点击无效的解决办法
在List_Item布局文件中的根节点加上如下背景标黄的这一行 <?xml version="1.0" encoding="utf-8"?> < ...
- GridView的点击事件冲突解决
在开发的时候,常常可能遇到ListView或GridView控件点击事件与Item点击事件冲突的问题.原因是Item布局中的button或ImageButton强制获取了item的焦点,解决方案之中的 ...
- form表单中button按钮返回上一页解决办法
解决Form中button按钮不好用的问题解决办法. 方法一: 1.在Form表单标签中国增加一个属性,如下图,红框处 2.返回按钮样式 3.onclick方法需要跳转的页面,遮挡处为需要返回的页面 ...
- android ListView中button点击事件盖掉onItemClick解决办法
ListView 1.在android应用当中,很多时候都要用到listView,但如果ListView当中添加Button后,ListView 自己的 public void onItemClick ...
- android ListView中含有按钮事件实时更新ListView数据案例
1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...
- ListView中嵌套GridView点击事件
做一个项目时,需要在ListView中嵌套GridView,因为ListView的每个条目中不一定出现GridView,那么问题来了,添加GridView的Item的点击事件后,有GridView出现 ...
- xamarin.android listview绑定数据及点击事件
前言 listview是用来显示数据列表的一个控件,今天给大家带来如何使用cursor进行数据绑定以及点击事件. 导读 1.如何创建一个listview 2.如何使用cursor进行绑定数据 3.li ...
- Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; ...
- Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法
本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...
随机推荐
- homebrew长时间停在Updating Homebrew 这个步骤
在国内的网络环境下使用 Homebrew 安装软件的过程中可能会长时间卡在 Updating Homebrew 这个步骤. 例:执行 brew install composer 命令 ➜ ~ brew ...
- hive如何配置支持事务及insert、update、delete
Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置.要想支持行级insert.update.delete,需要配置Hive支持事务. 一.Hive具有ACID语义事务的 ...
- day18 17.c3p0连接池使用
连接池时间长不用空闲着,dbcp是不回收的,性能可能有些问题.c3p0是可以自动回收.实际开发中c3p的生产力比dbcp强,性能上更强. package cn.itcast.datasource; i ...
- day37 01-上次课内容回顾
- day36 04-Hibernate检索方式:多表连接查询
返回的是一个List集合,这个List集合的泛型是一个Object数组.最后会拿到一个里面放Object数组的List集合. HQL内连接查询,发出SQL语句查询出来的结果集被Hibernate封装成 ...
- idea添加jar包
之前一直使用eclipse,现在使用idea,发现两者引用外部jar的时候不太一样,分享一下. 使用eclipse引用外部jar的时候,我们可以在工程下新建一个lib包来存放,然后add to bui ...
- Win7系统中wmiprvse.exe占用CPU高如何解决
该进程的详细路径是在:C:\WINDOWS\System32\Wbem 我们可以在任务管理器中“wmiprvse.exe”进程上单击右键,选择“打开文件位置”即可看到,如果该文件不在该文件夹中,那么 ...
- OpenLayers使用点要素作为标记
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- Servlet容器container
通俗点说,所谓容器,就是放东西的地方.Servlet容器自然就是放Servlet的地方.J2EE开发,是有分工的.一般的程序员,写得都是应用开发,我们会按照一定的规则,开发我们的系统,比如用Servl ...
- python流程控制和循环
变量的命名:可以由数字字母下换线组成 ,不能以数字开头,可以使用中文但是不推荐使用中文,不推荐前面使用_ __,不能使用系统的关键字,变量名严格区分大小写 逻辑运算优先级 or<and<n ...