плохой тип convertView BaseAdapter из ListView - PullRequest
9 голосов
/ 08 декабря 2011

У меня есть адаптер представления списка, который использует различные типы строк представления.

Большую часть времени он работает нормально. Но когда я удаляю элемент из списка, он вылетает. Он посылает convertView неправильного типа в getView

public View getView(int position, View convertView, ViewGroup patent) ...  

Но getItemViewType возвращает правильный тип.

public int getItemViewType(int position)

так что я вижу что-то похожее на это

дайте мне тип для позиции 1 -> возвращает правильный тип (скажем, 1)

дать мне представление для позиции 1 с представлением содержимого для неправильного типа (скажем, типа 2.)

Есть идеи?

Ответы [ 4 ]

20 голосов
/ 27 декабря 2011

Попробуйте переопределить getViewTypeCount ()

@Override
public int getViewTypeCount() {
       return types;
}

Возвращает количество типов представлений, которые будут созданы getView (int, View, ViewGroup). Каждый тип представляет собой набор представлений, которые можно преобразовать в getView (int, View, ViewGroup).

3 голосов
/ 08 октября 2013

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

     /**
     * @return A view from the ScrapViews collection. These are unordered.
     */
    View getScrapView(int position) {
        if (mViewTypeCount == 1) {
            return retrieveFromScrap(mCurrentScrap, position);
        } else {
            int whichScrap = mAdapter.getItemViewType(position);
            if (whichScrap >= 0 && whichScrap < mScrapViews.length) {
                return retrieveFromScrap(mScrapViews[whichScrap], position);
            }
        }
        return null;
    }

Вы должны переопределить getViewTypeCount(), возвращая количество типов представлений, которые у вас есть, и переопределить getItemViewType(int position) возвращая тип представления в диапазоне от 0 до getViewTypeCount() - 1

1 голос
/ 16 марта 2016

У меня была та же проблема, и это привело к сбоям или неожиданному поведению.
Вот как я исправил свою проблему:

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return mlistItems.get(position).type.ordinal();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ListItem item = mListems.get(position);

    if (convertView == null) {
        switch (item.type) {
            case Header:
                converview = // Inflate Header Row
                break;
            case Content:
                converview = // Inflate Content Row
                break;
        }
    }

    switch (item.type) {
            case Header:
                //Set header row content
                break;
            case Content:
                //Set content row content
                break;
    }

    return convertView;
}
1 голос
/ 21 декабря 2011

Это нормально, если вы получите View с другим типом в convertView, вы создадите new View, а не повторно convertView.

Возможно, нет многоразовых представлений с данным типом.

Примечание : Этот ответ от 2011 и может больше не применяться.

...