2010-11-15 46 views
4

我有一個ListView,其行被格式化。每行都有ImageView和TextView的混合。 我也實現了我自己的適配器,並能夠通過它繪製每一行。現在有關ListClick自定義行佈局項目上的onClick()事件的幫助

,我希望像這個 -

  • 用戶點擊ImageView的(沒有任何其他地方上的行,但僅此的ImageView應該響應點擊)
  • 我結識的位置ImageView被點擊的那一行。

我已經嘗試了很多事情,並希望我的代碼儘可能高效(在矯枉過正方面)。 目前我只能捕獲該特定ImageView上的點擊事件,但我不知道點擊了哪一行。

我提供了一個屬性的XML行像這個 -

<ImageView android:id="@+id/user_image" 
    android:padding="5dip" 
    android:layout_height="60dip" 
    android:layout_width="60dip" 
    android:clickable="true" 
    android:onClick="uImgClickHandler"/> 

而且在我的代碼,我有這樣的方法:

public void uImgClickHandler(View v){ 
    Log.d("IMG CLICKED", ""+v.getId()); 
    LinearLayout parentRow = (LinearLayout)v.getParent(); 

} 

我可以得到父行(也許)但我不確定如何從這裏走得更遠。 有人可以幫忙嗎?

+0

你到底想要達到什麼目的?你想在其他行部件上設置一些屬性嗎? – 2010-11-15 06:42:59

+0

我希望用戶只點擊imageview,而不是該行的其他任何地方,並且基於點擊的imageview,我想知道該行的位置,然後在該位置的數據源中查找,得到一些信息並開始另一項活動。順便通過以下的回答解決了。 – 2010-11-15 07:46:24

回答

13

請參考此,
我只是寫的代碼給你的想法,而不是在正確的格式

class youaddaper extends BaseAdapter{ 

    public View getView(int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflate = LayoutInflater.from(context); 
     View v = inflate.inflate(id, parent, false); 

     ImageView imageview = (ImageView) v.findViewById(R.id.imageView); 
     imageview.setOnClickListener(new imageViewClickListener(position)); 
     //you can pass what ever to this class you want, 
     //i mean, you can use array(postion) as per the logic you need to implement 
    } 
    class imageViewClickListener implements OnClickListener { 
    int position; 
    public imageViewClickListener(int pos) 
     { 
      this.position = pos; 
     } 

    public void onClick(View v) { 
     {// you can write the code what happens for the that click and 
     // you will get the selected row index in position 
    } 
} 

}

希望它可以幫助你

+0

好。它確實有幫助。我會嘗試一下。 – 2010-11-15 07:10:15

+0

它工作。但是可能會增加一些開銷,因爲它會爲每個imageview分隔對象。稍後會優化它。謝謝! :) – 2010-11-15 07:59:03

+0

這也適用於我。我對你關於創建單獨對象的評論感興趣,以及什麼是更好的方法來做到這一點。我見過的幾個例子總是在裏面創建監聽器對象。 – 2011-02-24 16:37:32

0

,你可以簡單地做這樣的: 在我們的適配器的getview方法中 Button btn1 =(Button)convertView.findViewById(R.id.btn1); btn1.setOnClickListener(mActivity);

進一步可以爲活動的背景下您的活動處理onclick事件,, 這裏mActivity只是通過這種在適配器的建築工,在這裏撒在活動像 MyActivity mActivity =(MyActivity)上下文; 在適配器中。 感謝名單

+0

這是一個有效的選項,但是當單擊此按鈕並將控件傳遞給駐留在活動中的中心方法時,它不會有足夠的關於此按鈕位於哪個行的知識,這使得它很難。 – 2012-12-26 08:22:32

0

這顯示在ListActivity,其項目佈局包含了Android的ImageView的工作:的onClick =「editImage」:

public void editImage(View v) { 
     int[] loc = new int[2]; 
     v.getLocationInWindow(loc); 
     int pos = getListView().pointToPosition(loc[0], loc[1]); 
     Cursor c = (Cursor) adapter.getItem(pos); 
     // c now points at the data row corresponding to the clicked row 
} 
1

另一種選擇是使用方法setTag()和視圖的getTag()。您可以設置它在你的getView這樣的:

imageView.setTag(new Integer(position)); 

然後在onClick()你可以找到標籤:

Integer tag = v.getTag(); 

這將被用來將圖像視圖相關聯的列表視圖的位置項目。

請注意,如果列表視圖可能會丟失中間的項目,以便項目位置在列表視圖的生命週期內發生更改,則此方法會出現問題。