错误的convertView类型ListView的BaseAdapter

时间:2011-12-08 18:46:04

标签: android listview listview-adapter

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

大部分时间它工作正常。但是当我从列表中删除一个元素时它会崩溃。它将不正确类型的convertView发送到getView

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

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

public int getItemViewType(int position)

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

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

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

有什么想法吗?

4 个答案:

答案 0 :(得分:20)

尝试覆盖getViewTypeCount()

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

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

答案 1 :(得分:3)

当正确实现时,ListView保证作为convertView提供的视图来自正确的Type

     /**
     * @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范围内的视图类型

答案 2 :(得分:1)

这是正常的,如果View中的convertView类型不同,则会创建new View,而不是重复使用convertView

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

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

答案 3 :(得分:1)

我遇到了同样的问题,导致了崩溃或意外行为 这就是我如何解决我的问题:

    getViewTypeCount()应返回视图中不同类型行的数量
    getItemViewType(...)应该返回位置的项目类型
    getView(...)应该在膨胀时在视图上设置枚举类型
SELECT 'about' AS a.about,title,null article ,null description,MATCH(a.title) AGAINST ('\"$search\"' IN BOOLEAN MODE) as scale

FROM about a 

WHERE 
(
MATCH(a.about) AGAINST ('\"$search\"' IN BOOLEAN MODE)
)

UNION
SELECT 'articles' AS null, b.title,b.article,b.description,MATCH(b.title) AGAINST ('\"$search\"' IN BOOLEAN MODE) as scale
from articles b 

WHERE
(
MATCH(b.title,b.article,b.description) AGAINST ('\"$search\"' IN BOOLEAN MODE)
)

ORDER BY scale  DESC