Добавление обработчика onClick для просмотра в элементе списка

У меня есть ListActivity, где элементы списка определены в другом макете XML. Макет элемента списка содержит ImageView, CheckBox, TextView и тому подобное.

Я хочу установить прослушиватель onClick для CheckBox в каждом элементе списка. Это достаточно легко. Проблема в том, что мне нужно, чтобы обработчик onClick знал, в какой позиции он находится в списке.

Я присоединяю прослушиватель к CheckBox в getView после того, как этот convertView был раздут. У метода getView есть параметр position, но я не могу сослаться на него в обработчике onClick для моего CheckBox. Я понимаю, почему, но я не знаю, как это обойти.

Как мне это сделать?


person Andrew    schedule 12.08.2010    source источник


Ответы (2)


Я создал этот метод, чтобы получить позицию:

    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

person Andrew    schedule 16.09.2010

Вы можете попробовать установить тег на флажке по его положению, и когда 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
                }
            });
    }
}
person capecrawler    schedule 13.08.2010
comment
Кто-то опубликовал это решение, а затем удалил его, как только я изложил свою проблему. Моя проблема в том, что мой список может быть изменен пользователем (например, удаление строки). Это испортит все индексы строк ниже удаленной строки. - person Andrew; 13.08.2010
comment
Я не могу придумать другого более простого решения, чем то, что вы предоставили. Если бы я был тобой, я бы пошел на это. - person capecrawler; 26.08.2010