ListView порождения BaseAdapter для движения не в порядке при прокрутке

У меня есть проблемы с некоторым кодом BaseAdapter, который я адаптировал из книги. Я использовал изменения этого кода повсеместно в моем приложении, но только что понял при прокрутке длинного списка, объекты в ListView становятся смешанными, и не все элементы отображены.

Очень трудно описать точное поведение, но легко видеть, берете ли Вы отсортированный список 50 объектов и начинаете прокручивать вверх и вниз.

class ContactAdapter extends BaseAdapter {

    ArrayList<Contact> mContacts;

    public ContactAdapter(ArrayList<Contact> contacts) {
        mContacts = contacts;
    }

    @Override
    public int getCount() {
        return mContacts.size();
    }

    @Override
    public Object getItem(int position) {
        return mContacts.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if(convertView == null){
            LayoutInflater li = getLayoutInflater();
            view = li.inflate(R.layout.groups_item, null);
            TextView label = (TextView)view.findViewById(R.id.groups_item_title);
            label.setText(mContacts.get(position).getName());
            label = (TextView)view.findViewById(R.id.groups_item_subtitle);
            label.setText(mContacts.get(position).getNumber());
        }
        else
        {
            view = convertView;
        }
        return view;
    }

}
9
задан Austin Wagner 25 June 2010 в 20:16
поделиться

1 ответ

Вы помещаете данные в виджеты TextView только при их первом создании. Вам нужно переместить эти четыре строки:

        TextView label = (TextView)view.findViewById(R.id.groups_item_title);
        label.setText(mContacts.get(position).getName());
        label = (TextView)view.findViewById(R.id.groups_item_subtitle);
        label.setText(mContacts.get(position).getNumber());

после блока if / else и перед возвратом метода, поэтому вы обновляете виджеты TextView , независимо от того, вы перерабатываете строку или создаете новую.

13
ответ дан 4 December 2019 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: