1. 程式人生 > >Android Listview中Button按鈕點選事件衝突解決辦法

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:

[html] view plain copy  print?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="horizontal"
    >
  6.     <ImageView
  7.         android:id="@+id/avatar"
  8.         android:layout_width="80dp"
  9.         android:layout_height="80dp"
  10.         android:src="@drawable/ic_launcher"/>
  11.     <LinearLayout
  12.         android:layout_width="fill_parent"
  13.         android:layout_height="wrap_content"
  14.         android:orientation
    ="vertical"
  15.         android:padding="10dp">
  16.         <TextView
  17.             android:id="@+id/title"
  18.             android:layout_width="wrap_content"
  19.             android:layout_height="wrap_content"
  20.             android:layout_margin="10dp"
  21.             android:padding="6dp"
  22.             android:text="玫瑰花園"
  23.             android:textSize="16sp"/>
  24.         <Button
  25.             android:id="@+id/btn"
  26.             android:layout_width="fill_parent"
  27.             android:layout_height="wrap_content"
  28.             android:layout_margin="2dp"
  29.             android:focusable="false"
  30.             android:padding="6dp"
  31.             android:text="玫瑰花園"
  32.             android:textSize="16sp"/>
  33.     </LinearLayout>
  34. </LinearLayout>
注; Button的android:focusable必須設定為false,以免它搶了父控制元件(也就是每一個Item)的焦點。

接下來,我們定義一個Bean,Plan.java:

[java] view plain copy  print?
  1. publicclass Plan {  
  2.     public String name;  
  3.     public String avatar;  
  4.     public Plan(String name, String avatar) {  
  5.         super();  
  6.         this.name = name;  
  7.         this.avatar = avatar;  
  8.     }  
  9.     @Override
  10.     public String toString() {  
  11.         return"Plan [name=" + name + ", avatar=" + avatar + "]";  
  12.     }  
  13. }  

實現ListView的Adapter,MyAdapter.java: [java] view plain copy  print?
  1. package com.wuyuan.listbtn;  
  2. import java.util.List;  
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.BaseAdapter;  
  9. import android.widget.Button;  
  10. import android.widget.ImageView;  
  11. import android.widget.TextView;  
  12. publicclass MyAdapter extends BaseAdapter {  
  13.     private Context mContext;  
  14.     private LayoutInflater mInflater;  
  15.     private List<Plan> mDatas;  
  16.     private OnClickListener onClickListener;  
  17.     public MyAdapter(Context context, List<Plan> datas,  
  18.             OnClickListener onClickListener) {  
  19.         mContext = context;  
  20.         mInflater = LayoutInflater.from(mContext);  
  21.         mDatas = datas;  
  22.         this.onClickListener = onClickListener;  
  23.     }  
  24.     @Override
  25.     publicint getCount() {  
  26.         return (mDatas != null ? mDatas.size() : 0);  
  27.     }  
  28.     @Override
  29.     public Object getItem(int position) {  
  30.         return (mDatas != null ? mDatas.get(position) : null);  
  31.     }  
  32.     @Override
  33.     publiclong getItemId(int position) {  
  34.         return position;  
  35.     }  
  36.     @Override
  37.     public View getView(int position, View convertView, ViewGroup parent) {  
  38.         ViewHolder holder = null;  
  39.         if (convertView == null) {  
  40.             // 下拉項佈局
  41.             convertView = mInflater.inflate(R.layout.list_item_btn, null);  
  42.             holder = new ViewHolder();  
  43.             holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);  
  44.             holder.title = (TextView) convertView.findViewById(R.id.title);  
  45.             holder.btn = (Button) convertView.findViewById(R.id.btn);  
  46.             convertView.setTag(holder);  
  47.         } else {  
  48.             holder = (ViewHolder) convertView.getTag();  
  49.         }  
  50.         Plan plan = mDatas.get(position);  
  51.         if (plan != null) {  
  52.             holder.title.setText(plan.name);  
  53.             // 通常將position設定為tag,方便之後判斷點選的button是哪一個
  54.             holder.btn.setTag(position);  
  55.             holder.btn.setOnClickListener(this.onClickListener);  
  56.         }  
  57.         return convertView;  
  58.     }  
  59.     staticclass ViewHolder {  
  60.         ImageView avatar;  
  61.         TextView title;  
  62.         Button btn;  
  63.     }  
  64. }  

注:

 1. 構造方法中,我們傳入了OnClickListener,主要是為了讓每一個Item的Button監聽該事件.

 2. holder.btn.setOnClickListener(this.onClickListener); 為Button設定點選事件監聽。

 3. 為Button設定tag,tag的值為position,這樣可以方便獲取該Button所在的List中的位置。

最後,設定列表及事件監聽:

[java] view plain copy  print?
  1. publicclass MainActivity extends Activity {  
  2.     private ListView list_view;  
  3.     private List<Plan> plans;  
  4.     @Override
  5.     

    相關推薦

    Android ListviewButton按鈕事件衝突解決辦法

     今天做專案時,ListView中含有了Button元件,心裡一早就知道肯定會有衝突,因為以前就遇到過,並解決過,可惜當時沒有記錄下來。 今天在做的時候,繼續被這個問題鬱悶了一把,後來解決後,趕緊來記錄下,以便日後參考。   首先,其實Listview中Button按

    TableView cell的選中事件 與手勢事件 衝突解決辦法

    三步曲 1、遵守UIGestureRecognizerDelegate協議 2、給手勢觸發動作新增代理  程式碼如下 UITapGestureRecognizer *hideTap = [[UITapGestureRecognizer alloc]initWithTarge

    Tap手勢與UITableView事件衝突解決辦法

      在我們的開發過程中經常會遇到點選頁面回收鍵盤的需求,當然這個很好解決。   在我們的開發過程中也會遇到點選某一選項之後回收列表,這個也很容易實現。   那麼,問題來了,當這兩個碰到一起怎麼辦呢,你可以按照正常的程式碼去寫,但是,當你點選的時候你會發現,並沒有出現你預期要

    Android小記:ListView按鈕響應事件

    在Adapter中定義一個回撥介面,在Activity中實現該介面,從而實現對點選事件的響應。 有兩種方式都能比較好的實現:使用介面回撥和使用抽象類回撥 1.使用介面回撥: Adapter類: package com.ivan.adapter;

    Android listview的itembutton事件 item和button 可同時點

    此種應用情形在android開發中會遇到很遇到很多 在此闡述一下我的解決方案 第一步 給一個listview xml 可根據自己需要自己佈局 第二步 給listview 一個adapter 我們需要在 adapter 中 定義一個點選響應介面 OnCl

    asp.netButton按鈕兩次才執行Onclick事件的原因

         今天寫了一個簡單的聊天室,有登入頁面和聊天室,當從登入頁面跳入到聊天室過後,卻發現要點選兩次傳送按鈕才能傳送到顯示區,然後傳送按鈕正常執行。       通過不斷測試,發現,第一次點選並沒有執行點選事件,第二次才執行的點選事件。並且也找到了問題所在。下面用一個

    openDialog()確定按鈕事件

    openDialog()中確定按鈕點選事件 本文是我在開發過程中,遇到的也是我不知道的知識,所以此篇僅當做自己以後借鑑用的,如果能對看官你也有用,榮幸之至。 form.ajaxSubmit 首先,在jeeplus中xxxform.jsp檔案中,一般openDialog()

    Android studio設定按鈕變色效果的方法

    一、在drawable下新建一個xml 名字"test" 程式碼如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.androi

    asp.net按鈕事件

    ASP.NET中Onclick和OnserverClick事件的區別 對於伺服器按鈕控制元件(即<asp:Button>型別的按鈕): 伺服器響應事件:OnClick 客戶端響應屬性:OnClientClick 對於html按鈕控制元件(即<input ty

    ListViewItem的事件與Item控制元件的事件並存的方法

    在ListView的item的xml配置檔案的根節點新增屬性: android:descendantFocusability="blocksDescendants" 並且在要新增事件的子控制元件(如button)的屬性裡新增 andro

    黑馬66期android學習筆記16_按鈕事件

    一、專案結構 二、activity_main.xml程式碼 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schema

    SpannableString的ClickableSpan和Textview事件衝突解決

    背景描述:專案中有這樣的需求:在展示評論內容的Textview中展示文字,其中包含3種類型資料: 1、普通文字:評論內容或者回復內容。因為這個Textview是展示評論或者回復的,點選後,要展示軟鍵盤(popupwindow等忽略) 2、股票程式碼:該型別文

    表單提交與按鈕事件衝突

    問題出現的原因:在提交表單的時候經常會需要判斷表單內的內容是否合法,這時候就需要處理提交按鈕點選事件與表單action屬性的關係, 問題體現:無論表單內的內容是否合法,都會跳轉到action繫結的地址。 解決辦法: 一:用form表單的onsubmit方法添進行呼叫,不

    在Angular輸入框內按下回車會觸發其它button事件解決方法

    將不需要觸發事件的button上新增type="button"即可<button type="button" (click)="clickMe()">click</button>參考:https://stackoverflow.com/question

    ionic開發——百度地圖InfoWindow資訊視窗上新增按鈕,無法觸發事件問題解決辦法

    ionic開發中,在使用百度地圖的時候,有時我們需要在點選地圖上標註的海量點彈出一個infowindow的資訊視窗,自定義資訊視窗的內容後,我們想要可以在資訊視窗上面點選的時候,發現點選沒有效果。 我

    swiper輪播圖包在div(tab切換)下js上一頁下一頁事件失效解決辦法

    問題:    兩種解決辦法: 解決辦法一: var mySwiper = new Swiper ('.swiper-container', { nextButton: '.swiper-button-next', p

    form表單button按鈕返回上一頁解決辦法

    解決Form中button按鈕不好用的問題解決辦法。 方法一: 1.在Form表單標籤中國增加一個屬性,如下圖,紅框處 2.返回按鈕樣式 3.onclick方法需要跳轉的頁面,遮擋處為需要返回的頁面 方法二: 1.把button按鈕的標籤換成input標籤,那麼Form標籤中就不用填寫act

    GridView的事件衝突解決

          在開發的時候,經常可能遇到ListView或GridView原因是Item佈局中的button或ImageButton強制獲取了item的焦點,解決方式之一是:只要設定Item佈局中的bu

    Android:處理ListView條目Button事件和條目事件衝突

    一 . 此條方法比較笨.       給條目中的1號區域的Button設定完了點選事件後,再給條目中的2號區域再設定點選事件 二 . 這個方法就比較簡單.     1 . 在ItemView配置的xml檔案中的根節點新增屬性android:descendantFocus

    AndroidListView響應item內部按鈕事件

    ListView可以說是我們在實際開發中最常用到的控制元件了。可以說每一個app都需要用到listview來顯示列表,如果我們需要點選listView的不同按鈕跳轉到不同頁面,具體邏輯在重寫的onItemClick()方法中實現,這裡不多說,不瞭解listVie