Android:从自定义列表视图中单击的按钮获取列表视图项目
Posted
技术标签:
【中文标题】Android:从自定义列表视图中单击的按钮获取列表视图项目【英文标题】:Android: Get the listview item from button clicked in custom listview 【发布时间】:2012-06-24 17:53:26 【问题描述】:我有一个带有两个按钮的自定义 ListView,当我单击任意行上的任一按钮时,我想在 Listview 上获取文本标签,现在只需用它弹出一个 toast。到目前为止,我一直在获取数组中的最后一项。
这是一个屏幕截图,可让您更好地了解我的意思
这是我的自定义 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();
【问题讨论】:
尝试用textView.getText().toString()
代替values[which]
。
【参考方案1】:
容易做到:
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();
);
【讨论】:
我在我的 XML 中使用了相对布局。我已经这样做了,并且有一些改进,但是当我第一次单击每个按钮时,我得到了前一个 TextView 的值,之后我得到了正确的值。我还在 Logcat 中收到警告:06-22 14:28:29.279: W/Resources(14841): Converting to string: TypedValuet=0x12/d=0x0 a=3 r=0x7f050002 这不应该发生,因为上面的代码使用单击的按钮来查找父级(行),然后使用它来查找兄弟文本视图...您可以编辑您的帖子以将代码显示为现在是? 我现在已经编辑了我的帖子。我也很惊讶,因为我相信它应该会起作用。 天哪,我想我以前应该在 getparent 下方有 get 文本 这实现起来要简单得多【参考方案2】:使用 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();
);
【讨论】:
哇,这成功了。你能简单解释一下你到底在做什么吗 基本上每个视图都可以使用 setTag 保留任何对象来自该特定按钮的标签.........【参考方案3】:如果您有一个 ListActivity,并且您没有使用自己的适配器,您仍然可以获得属于被点击按钮的列表项,如下所示:
在列表行的布局文件中:
<ImageButton
android:id="@+id/button_call"
android:layout_
android:layout_
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();
【讨论】:
【参考方案4】:只需使用 getItem() 并传递位置
例如:getItem(position).getID()
这里的getID()方法是getter方法
【讨论】:
【参考方案5】:将 onClick="click" 设置为按钮/图像/等的 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();
【讨论】:
哇,这看起来如此简单。您不必定义其他任何东西吗?比如getListView()
或position
是什么
最终 int 位置 = getListView().getPositionForView(v);以上是关于Android:从自定义列表视图中单击的按钮获取列表视图项目的主要内容,如果未能解决你的问题,请参考以下文章
如何从自定义列表视图中获取选定项目并在 toast 消息中打印?