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

时间:2010-08-12 19:39:00

标签: android onclick adapter android-arrayadapter

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

我想要的是在每个列表项中为CheckBox设置onClick侦听器。这很容易。麻烦的是我需要onClick处理程序来知道列表中的哪个位置。

在convertView被夸大之后,我将侦听器附加到getView中的CheckBox。 getView方法有一个位置参数,但我无法在我的CheckBox的onClick处理程序中引用它。我理解为什么,但我不知道如何绕过它。

我如何做到这一点?

2 个答案:

答案 0 :(得分:1)

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

    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参数传递

答案 1 :(得分:0)

您可以尝试在复选框上按其位置设置标记,当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
                }
            });
    }
}