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

时间: 2024-09-06 22:02:15

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

listview-android-怎么在一个ListView中监听点击事件?

问题描述 android-怎么在一个ListView中监听点击事件? 我现在有这个代码 ListView list = (ListView)findViewById(R.id.ListView01); ... list.setAdapter(adapter); 当我像下边这么做的时候 list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(Adapte

getview()-android getView中 position=0多次出现的解决办法

问题描述 android getView中 position=0多次出现的解决办法 适配器中的getview @Override public View getView(int position, View convertView, ViewGroup parent) { View view = View.inflate(context,R.layout.home_item,null); TextView tv = (TextView) view.findViewById(R.id.homeIt

android 往dialog中加入listview,并实现listview中item的点击事件

LinearLayout linearLayoutMain = new LinearLayout(this);//自定义一个布局文件 linearLayoutMain.setLayoutParams(new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); ListView listView = new ListView(this);//this为获取当前的上下文 listView.setFadingEdg

简单讲解Android开发中触摸和点击事件的相关编程方法_java

在Android上,不止一个途径来侦听用户和应用程序之间交互的事件.对于用户界面里的事件,侦听方法就是从与用户交互的特定视图对象截获这些事件.视图类提供了相应的手段. 在各种用来组建布局的视图类里面,你可能会注意到一些公共的回调方法看起来对用户界面事件有用.这些方法在该对象的相关动作发生时被Android框架调用.比如,当一个视图(如一个按钮)被触摸时,该对象上的onTouchEvent()方法会被调用.不过,为了侦听这个事件,你必须扩展这个类并重写该方法.很明显,扩展每个你想使用的视图对象(只

解决ListView中的Item点击事件和子控件的冲突或者item点击没有反应

fragment中添加了button和checkbox这些控件,此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应. 这时候就可以使用descendantFocusability来解决啦,API描述如下: android:descendantFocusability 该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系. 属性的值有三种: beforeDescendants:viewgroup会优先其子类控件而获取到焦点

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

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

android ListView中嵌套GridView不完全显示如何解决

项目需要,在ListView中显示多张图片,用到了GridView,不过如果使用普通的GridView,Item仅仅只是显示一部分,超出第一行以后的都无法显示了,这个很无语,所以又得继承下GridView重写onMeasure方法去测量子控件的宽高了.. 这里只是贴出自定义GridView的代码,直接在xml中使用,ListView的Adapter中调用即可:  代码如下 复制代码 public class GridViewForListView extends GridView {     p

Android开发中setLatestEventInfo、Handler、SimpleDateFormat警告解决办法

今天在做Android 4.4.2下的APP开发时,使用了Notification下的setLatestEventInfo()方法时,Eclipse却提示:" 不建议使用类型 Notification 的方法setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent)"! 这是为什么呢?查询后得知:setLatestEventInfo该方法已被deprecate,不建议使用了.  /**  * @hide

css给button按钮设置padding样式无效解决办法

在使用css给button设置padding样式时,发现不起作用.直接上代码:  代码如下 复制代码     <!DOCTYPE HTML>     <html lang="zh-CN">     <head>     <meta charset="UTF-8">     <title>Document</title>     <style type="text/css"