将 onClick 处理程序添加到列表项中的 View

发布于 2024-09-14 10:42:40 字数 306 浏览 9 评论 0原文

我有一个 ListActivity,其中列表项是在另一个 XML 布局中定义的。列表项布局包含 ImageView、CheckBox、TextView 等。

我想要的是为每个列表项中的复选框设置一个 onClick 侦听器。这很容易。问题是我需要 onClick 处理程序来知道它在列表中的哪个位置。

在 ConvertView 膨胀后,我将侦听器附加到 getView 中的复选框。 getView 方法有一个位置参数,但我无法在 CheckBox 的 onClick 处理程序中引用它。我明白为什么,但我不知道如何解决它。

我该如何实现这个目标?

I have a ListActivity where the list items are defined in another XML layout. The list item layout contains an ImageView, a CheckBox, a TextView and such.

What I want is to set an onClick listener to the CheckBox in each list item. That is easy enough. The trouble is I need that onClick handler to know which position in the list it is.

I'm attaching the listener to the CheckBox in getView after that convertView has been inflated. The getView method has a position parameter, but I cannot reference it in the onClick handler for my CheckBox. I understand why, but I don't know how to get around it.

How do I accomplish this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

离鸿 2024-09-21 10:42:40

我创建了这个方法来获取位置:

    private int getListPosition(View v) {
        View vParent = (View)v.getParent();
        if (vParent != null) {
            ViewGroup vg = (ViewGroup)vParent.getParent();
            if (vg != null) {
                return getListView().getFirstVisiblePosition() + vg.indexOfChild(vParent);
            }
        }
        return -1;
    }

您将传入 buttonView 作为 v 参数

I created this method to get the position:

    private int getListPosition(View v) {
        View vParent = (View)v.getParent();
        if (vParent != null) {
            ViewGroup vg = (ViewGroup)vParent.getParent();
            if (vg != null) {
                return getListView().getFirstVisiblePosition() + vg.indexOfChild(vParent);
            }
        }
        return -1;
    }

You would pass in buttonView as the v parameter

画▽骨i 2024-09-21 10:42:40

您可以尝试通过其位置在复选框上设置标签,当 onCheckedChangeListener 被触发时,获取复选框的标签来获取其位置。

这是一个示例代码,但我还没有尝试过

@Override
public View getView(int position, View convertView, ViewGroup parent) {

// grab view
View v = convertView;
// set view layout
if (v == null) {
    LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = vi.inflate(R.layout.layout_inbox_item, null);

    CheckBox box = (CheckBox)v.findViewById(R.id.inbox_itemcheck);
    if (box != null) {
        box.setTag(position); //<-- sets the tag by its position
        box.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int position = (Integer)buttonView.getTag(); //<-- get the position
                }
            });
    }
}

You can try setting a tag on the checkbox by its position and when the onCheckedChangeListener gets fired, get the tag of the checkbox to get its position..

here is a sample code but I haven't tried it

@Override
public View getView(int position, View convertView, ViewGroup parent) {

// grab view
View v = convertView;
// set view layout
if (v == null) {
    LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = vi.inflate(R.layout.layout_inbox_item, null);

    CheckBox box = (CheckBox)v.findViewById(R.id.inbox_itemcheck);
    if (box != null) {
        box.setTag(position); //<-- sets the tag by its position
        box.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int position = (Integer)buttonView.getTag(); //<-- get the position
                }
            });
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文