今天做项目时,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="/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());}};}
源码下载地址(免费):/detail/zuiwuyuan/9192201
如果觉得《Android Listview中Button按钮点击事件冲突解决办法》对你有帮助,请点赞、收藏,并留下你的观点哦!