9

我有一个使用不同类型的视图行的列表视图适配器。

大多数时候它工作正常。但是当我从列表中删除一个元素时,它会崩溃。它将错误类型的 convertView 发送到 getView

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

但是 getItemViewType 正在返回正确的类型。

public int getItemViewType(int position)

所以我看到一些看起来像这样的东西

给我位置 1 的类型 -> 返回正确的类型(比如 1)

给我一个位置 1 的视图,其中包含错误类型的内容视图(比如类型 2。)

有任何想法吗?

4

4 回答 4

20

尝试覆盖 getViewTypeCount()

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

返回将由 getView(int, View, ViewGroup) 创建的视图类型数。每种类型代表一组可以在 getView(int, View, ViewGroup) 中转换的视图。

于 2011-12-27T08:33:13.387 回答
3

正确实施时,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

于 2013-10-08T02:49:37.853 回答
1

这很正常,如果你得到一个View不同类型的 in convertView,你会创建一个new View,而不是重用convertView

给定类型可能没有可重用的视图。

注意:此答案来自2011 年,可能不再适用。

于 2011-12-21T03:18:56.893 回答
1

我有同样的问题,它导致崩溃或意外行为。
这就是我解决问题的方法:

    getViewTypeCount() 应该返回视图中不同类型的行数
    getItemViewType(...) 应该返回位置项的类型
    getView(...) 应该在膨胀时在视图上设置枚举类型
@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;
}
于 2016-03-16T19:22:33.677 回答