2012-06-22 125 views
13

我有一個自定義列表視圖與兩個按鈕,當我點擊任何一行上的任何一個按鈕我想獲得列表視圖上的文本標籤,現在只需彈出一個敬酒用它。到目前爲止沒有任何工作,我不斷收到我的數組中的最後一個項目。Android:從自定義列表視圖中點擊按鈕獲取列表視圖項目

這裏是一個截屏給你我的意思

enter image description here

這裏一個更好的主意是我爲我定製的ListView適配器子

static final String[] Names = 
      new String[] { "John", "Mike", "Maria", "Miguel"}; 


class MyArrayAdapter extends ArrayAdapter<String> { 
    private final Context context;  

    int which; 

    public MyArrayAdapter(Context context, String[] pValues) { 
     super(context, R.layout.main, pValues); 
     this.context = context; 
     values = pValues; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     rowView = inflater.inflate(R.layout.main, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.logo); 
     Button call = (Button) rowView.findViewById(R.id.button1); 
     Button chat = (Button) rowView.findViewById(R.id.button2); 
     textView.setText(values[position]); 


     // Change icon based on name 
     s = values[position];   
     which = position; 
     call.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       String name = values[which]; 
       Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return rowView; 
    } 
} 

編輯:

String name = textView.getText().toString(); 
RelativeLayout ll = (RelativeLayout)v.getParent(); 
textView = (TextView)ll.findViewById(R.id.label); 
Toast.makeText(CustomListView.this, name, 
Toast.LENGTH_SHORT).show(); 
+0

嘗試'textView.getText()。toString()'代替'values [which]''。 –

回答

14

這很容易做到:

call.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      RelativeLayout rl = (RelativeLayout)v.getParent(); 
      TextView tv = (TextView)rl.findViewById(R.id.label); 
      String text = tv.getText().toString(); 
      Toast.makeText(CustomListView.this, text, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
+0

我在我的XML中使用了相對佈局。我已經完成了這一點,並且有一些改進,但是第一次點擊每個按鈕時,我會得到正確的值,然後獲得之前TextView的值。 我還在Logcat中得到一個警告:06-22 14:28:29.279:W/Resources(14841):轉換爲字符串:TypedValue {t = 0x12/d = 0x0 a = 3 r = 0x7f050002} – Amanni

+0

這不應該'因爲上面的代碼使用單擊的按鈕來查找父級(行),然後使用它來查找兄弟文本視圖...可以編輯您的帖子以顯示代碼,因爲它是現在嗎? – Barak

+0

我已經編輯了我的帖子。我也很驚訝,因爲我相信它應該起作用。 – Amanni

5

使用View的setTag屬性..............

Button call = (Button) rowView.findViewById(R.id.button1); 
call.setTag(position); 

call.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int which = -1; 
       Obejct obj = v.getTag(); 
       if(obj instaceof Integer){ 
       which = ((Integer)obj).intValue(); 
        } 

       if(which >-1){ 
       String name = values[which]; 
       Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
+0

哇,這工作。你能簡單地解釋一下你到底在做什麼 – Amanni

+0

基本上每個視圖都有能力使用setTag保留任何對象我只需在該行的每個按鈕中設置標記的位置,並且當你在onClick中獲得View時(這是相同的按鈕)我只是取回特定按鈕的標籤......... –

+1

非常感謝您 – Amanni

3

如果你有一個ListActivity,和你不使用自己的適配器,你仍然可以獲取屬於輕擊按鈕的列表項,如下所示:

在列表行的佈局文件:

<ImageButton 
     android:id="@+id/button_call" 
     android:layout_height="48dip" 
     android:layout_width="48dip" 
     android:contentDescription="Call" 
     android:onClick="callBuddy" 
     android:src="@drawable/call_button_image" 
     /> 

在你ListActivity:

public void callBuddy(View view) { 

    int position = getListView().getPositionForView((View) view.getParent()); 
    Buddy buddyToCall = (Buddy) getListView().getItemAtPosition(position); 

    Toast.makeText(MyListActivity.this, String.format("Calling your buddy %s.", buddyToCall.name), Toast.LENGTH_SHORT).show(); 

} 
0

設置的onClick = 「點擊」 到按鈕/圖片/等的XML ...

並在您的活動,這樣做:

public void click(View v) { 
    final int position = getListView().getPositionForView(v); 
    String text = getListView().getItemAtPosition(position).toString(); 
    Toast.makeText(getApplicationContext, text, Toast.LENGTH_SHORT).show(); 
} 
+0

哇這似乎很簡單。你不需要定義其他的東西嗎?像什麼是getListView()或者'position' –

+0

final int position = getListView()。getPositionForView(v); –

0

只需使用的getItem(),並通過該位置 例如:getItem(position).getID() 這裏getID()方法是getter方法

相關問題