Добавяне на манипулатор onClick към View in list item

Имам ListActivity, където елементите от списъка са дефинирани в друго XML оформление. Оформлението на елемент от списъка съдържа ImageView, CheckBox, TextView и други.

Това, което искам, е да настроя слушател onClick на CheckBox във всеки елемент от списъка. Това е достатъчно лесно. Проблемът е, че имам нужда от този манипулатор onClick, за да знам на коя позиция в списъка е.

Прикачвам слушателя към CheckBox в getView, след като този convertView е надут. Методът getView има параметър за позиция, но не мога да го препратя в манипулатора 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