在按钮(位于ListView行)侦听器中获取数据对象

时间:2013-08-25 18:14:47

标签: android android-listview onclicklistener

好的,标题可能不清楚,这是我想要做的: 我有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类中做同样的事情?

1 个答案:

答案 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更好。