好的,标题可能不清楚,这是我想要做的: 我有ListView,每行内都有一些文本和一个按钮。我正在设置每个按钮(在我的自定义列表适配器中)的监听器:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater li;
li = LayoutInflater.from(context);
convertView = li.inflate(R.layout.list_item, null);
}
Item elem = elems.get(position);
TextView mainText = (TextView) convertView.findViewById(R.id.main_text);
TextView sideText = (TextView) convertView.findViewById(R.id.side_text);
mainText.setText(elem.desc);
sideText.setText(timestampToString(elem.date));
Button againButton = (Button) convertView
.findViewById(R.id.itemAgainButton);
againButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// onClick actions
}
});
现在在onClick方法中我需要访问从中创建当前行的Item对象。我不确定我是否清楚我想做什么。这里我在我的Activity类
中设置ListView元素的监听器lista.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Item item = (Item) parent.getItemAtPosition(position);
Intent i = new Intent(getApplicationContext(),
DidItItemActivity.class);
i.putExtra("id", item.id);
startActivity(i);
}
});
我可以使用parent.getItemAtPosition(position)
,这正是我所需要的。我怎样才能在Adapter类中做同样的事情?
答案 0 :(得分:0)
好的,首先你应该在getView方法中初始化LayoutInflater。更好的地方是适配器的构造函数。原因构造函数只调用一次,并且getView方法将被多次调用。
现在让我们回到你的主要问题。您不应该在适配器类中调用onClick方法,而是在活动中调用。为此,您可以使用给定视图的设置标记。要实现这一点,首先需要在适配器类中声明一个类
public static class ViewHolder {
int mId;
}
然后你必须为每个标签设置适当的id,它将与视图绑定。 喜欢这个
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
...
ViewHolder tag = new ViewHolder();
convertView.setTag(tag);
}
Item elem = elems.get(position);
...
ViewHolder tag = (ViewHolder) view.getTag();
tag.mId = elem.id;
...
}
最后一部分是关于在onClick方法中获取id值。当调用onClick时,您只需要在给定视图上调用getTag方法:
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ViewHolder tag = (ViewHolder) view.getTag();
int id = tag.mId;
}
最后一点,在newView方法中设置onClickListener更好。