Android: getView () не возвращает правильный объект View - PullRequest
1 голос
/ 12 января 2012

Я написал собственный ContactListAdapter, который выходит из ArrayAdapter.Предположим, что в списке всего три элемента.Я печатаю позицию и хеш-код объекта View, полученный при каждом вызове getView ().Я заметил, что объект просмотра не возвращается правильно.Я что-то здесь не так делаю?

private class ContactListAdapter extends ArrayAdapter<ContactItem> {
... ...
    @Override
    public View getView(int aPosition, View aConvertView, ViewGroup aParent) {
        Log.d(TAG, "Inside ContactListAdapter.getView()");
        if(aConvertView==null) {
             Log.d(TAG, "ConvertView is null");
             // Inflate view...
        }
        Log.d(TAG, "Pos: " + aPosition + " View: " + aConvertView.hashCode());
        return aConvertView;
    }

Вот журналы для первоначального создания представления:

D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): ConvertView is null
D/ContactsActivity(  759): Pos: 0 View: 1156974184
D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): ConvertView is null
D/ContactsActivity(  759): Pos: 1 View: 1157007416
D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): ConvertView is null
D/ContactsActivity(  759): Pos: 2 View: 1157027832

И журналы, когда я нажимаю на третий элемент в списке (Обратите внимание, как хэш-кодпервого и последнего элемента обменивается).Мой метод onClick только позволяет нескольким объектам в соответствующей записи списка:

D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): Pos: 0 View: 1157027832
D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): Pos: 1 View: 1157007416
D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): Pos: 2 View: 1156974184

И регистрирует, когда я нажимаю на второй элемент:

D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): Pos: 0 View: 1156974184
D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): Pos: 1 View: 1157007416
D/ContactsActivity(  759): Inside ContactListAdapter.getView()
D/ContactsActivity(  759): Pos: 2 View: 1157027832

Это наблюдается неоднократно, только хеш-код первогои последняя запись обменивается каждый раз.Что может быть причиной этого?

1 Ответ

3 голосов
/ 12 января 2012

convertView используется для повторного использования представления адаптера, поэтому, когда вы отображаете список и предполагаете, что ваш экран может отображать 5 строк за раз, тогда для создания представлений в 5 строках convertView останется нулевым, но при прокрутке внизваш адаптер создает новые представления для вашего представления адаптера, поэтому шестой элемент в представлении списка используется повторно в позиции 1.

...