Android Listview中Button按钮点击事件冲突解决办法
? 今天做項目時,ListView中含有了Button組件,心里一早就知道肯定會有沖突,因為以前就遇到過,并解決過,可惜當時沒有記錄下來。 今天在做的時候,繼續(xù)被這個問題郁悶了一把,后來解決后,趕緊來記錄下,以便日后參考。
??
? 首先,其實Listview中Button按鈕點擊事件沖突這種問題壓根就不是太大的問題,因為我們完全可以將一個TextView的Backgroud設(shè)置成一個selector,也可以將一個TextView設(shè)計成一個按鈕的樣子,這樣就可以繞過ListView和Button的沖突問題!
? ?
? 當然,如果非要使用Button,那可以利用以下方案解決。
? 首先,要了解的是,ListView和其它能觸發(fā)點擊事件的widget無法一起正常工作的原因是加入其它widget后,ListView的itemclick事件被其它widget的click事件屏蔽,所以將無法觸發(fā)。
? 如何做呢?
定義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" ><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>
接下來,我們定義一個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 + "]";}}
實現(xiàn)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設(shè)置為tag,方便之后判斷點擊的button是哪一個holder.btn.setTag(position);holder.btn.setOnClickListener(this.onClickListener);}return convertView;}static class ViewHolder {ImageView avatar;TextView title;Button btn;}}
注:
?1. 構(gòu)造方法中,我們傳入了OnClickListener,主要是為了讓每一個Item的Button監(jiān)聽該事件.
?2.?holder.btn.setOnClickListener(this.onClickListener); 為Button設(shè)置點擊事件監(jiān)聽。
?3. 為Button設(shè)置tag,tag的值為position,這樣可以方便獲取該Button所在的List中的位置。
最后,設(shè)置列表及事件監(jiān)聽:
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());}}; }
源碼下載地址(免費):?http://download.csdn.net/detail/zuiwuyuan/9192201
轉(zhuǎn)載于:https://www.cnblogs.com/hehe520/p/6329959.html
總結(jié)
以上是生活随笔為你收集整理的Android Listview中Button按钮点击事件冲突解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NOIP2012模拟试题【奶牛晒衣服】
- 下一篇: 由于TempDB设置错误导致SQL Se