1

好的,标题可能不清楚,这就是我想要做的:我有 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)它给了我我需要的东西。我怎样才能在适配器类中做同样的事情?

4

1 回答 1

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;
                }

最后一件事,设置 onClickListener 最好在 newView 方法中进行。

于 2013-08-25T19:10:54.547 回答