Просмотр событий внутри строки ListView

1

Привет, ребята, у меня есть список, который использует настраиваемый макет строки. Макет состоит из 2 меток, изображения и флажка.

Я пытаюсь запустить слушателя, когда флажок установлен. Слушатель я написал работы, но вместо того, чтобы стрелять для отдельной строки, он запускается для каждой отдельной строки в списке. Как если бы я установил флажок в своей первой строке, диалог откроется и будет работать правильно, однако 2, 3 и 4 строки также будут "стрелять".

Здесь соответствующая область моего кода:

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }
    final item o = items.get(position);
    if (o != null) {
        TextView tt = (TextView) v.findViewById(R.id.name);
        TextView bt = (TextView) v.findViewById(R.id.game);
        CheckBox cb = (CheckBox) v.findViewById(R.id.caught);
        if (cb != null && o.getStatus()) {
            cb.setChecked(true);
        } else {
            cb.setChecked(false);
        }
        if (tt != null) {
            tt.setText(o.getName());
        }
        if (bt != null && o.getStatus()) {
            bt.setText("Game: " + o.getGame());
        }

        cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                o.setStatus(isChecked);
                if (isChecked) {
                AlertDialog.Builder builder2 = new AlertDialog.Builder(
                        context);
                builder2.setTitle("What game are we talkin gabout?");
                builder2.setItems(Checklist.GAMES,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int item) {
                                Toast.makeText(context,
                                        Checklist.GAMES[item],
                                        Toast.LENGTH_SHORT).show();
                                o.setGame(Checklist.GAMES[item]);
                                o.setStatus(true);
                                me.notifyDataSetChanged();
                            }
                        });
                builder2.show();
                } else {
                    o.setGame("");
                    o.setStatus(false);
                    me.notifyDataSetChanged();
                }
            }
        });
    }
    return v;

}

Есть ли более подходящее место для создания моего слушателя для флажка?

  • 0
    Вы имеете в виду, что onCheckedChanged () вызывается для каждой строки - после одного клика?
  • 0
    Да, не имеет значения, какой ряд, они все будут звонить.
Теги:
view
listactivity
listeners

1 ответ

1
Лучший ответ

Я думаю, что это не хорошее решение, чтобы осваивать новый OnCheckedChangeListener каждый раз, когда представление обновляется со значениями. Было бы лучше установить слушателя только один раз для просмотра в точке, где это новое представление получает раздувание. Вы можете сделать o-Object доступным для слушателя, поместив его в тег cb (setTag (..)). Обратите внимание, что событие onCheckedChanged также срабатывает, когда вы устанавливаете состояние CB с помощью cb.setChecked().

например:

CheckBox cb = null;
if (v == null) {
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
    v = vi.inflate(R.layout.row, null);
    cb = (CheckBox) v.findViewById(R.id.caught);
    // set a listener
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            item o = (item) buttonView.getTag();
            // show your dialog
        }
    });
}

item o = items.get(position);
if (o != null) {
    TextView tt = (TextView) v.findViewById(R.id.name);
    TextView bt = (TextView) v.findViewById(R.id.game);
    cb = (CheckBox) v.findViewById(R.id.caught);
    cb.setTag(o);
    // set checked state & text
    // ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню