2012-06-22 119 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方法

相关问题