Флажки в ListActivity кажутся связанными; Зачем? Как мне это исправить? - PullRequest
0 голосов
/ 28 июня 2011

У меня есть действие, которое наследует ListActivity и показывает список, заполненный через макет XML и пользовательский класс адаптера. Это все хорошо, и, как ожидалось. Строка XML включает в себя флажок.

Теперь, что странно, так это то, что флажки кажутся связанными через столько строк. То есть, если я отмечаю флажок в строке 0, то он также проверяет флажки в строках 8, 18, 28, 38, 48 и т. Д.

С чего бы это и как я могу это исправить?

Если это уместно, я am повторно использую представление, переданное в мой адаптер, когда оно будет доступно. Также кажется, что когда я прокручиваю один из отмеченных в верхнюю часть экрана, следующий проверяемый является вторым в нижней части экрана.

Ниже мой getView код:

public View getView(int position, View convertView, ViewGroup parent) {     
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)
            mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.contacts_row, null);
    }

    cb.GroupMembership.moveToPosition(position);
    long cid = cb.GroupMembership.getLong(0);
    String clk = cb.GroupMembership.getString(1);
    String cnm = cb.GroupMembership.getString(2);
    long pid = cb.GroupMembership.getLong(3);

    ImageView bdg = (ImageView) v.findViewById(R.id.contactBadge);
    Uri pic = GroupsLib.getContactPhotoUri(pid);
    if (pic == null) {
        bdg.setImageResource(R.drawable.contactg);
    } else {
        bdg.setImageURI(pic);
    }

    ((TextView) v.findViewById(R.id.contactName)).setText(cnm);

    return v;
}

1 Ответ

2 голосов
/ 28 июня 2011

Когда вы повторно используете ваше представление, вы должны фактически установить состояние всех элементов управления в нем (таким образом, в основном, очистка).Именно потому, что он используется повторно.

Обычно это выглядит (в адаптере):

public View getView (int position, View convertView, ViewGroup parent) {
    SomeObject obj = getDataFromYourModel(position);
    if (convertView == null) { 
        convertView = ....; //inflate view here
    } 

    setMyViewParameters(obj,convertView);
}

public void setMyViewParameters(SomeObject obj, View view) {
    CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox_id);

    cb.setChecked(obj.isChecked);
    //other initialisation
}

Таким образом, вы всегда сбрасываете значения при повторном использовании представления.

...