我有一个列表视图适配器,它使用不同类型的视图行。
大部分时间它工作正常。但是当我从列表中删除一个元素时它会崩溃。它将不正确类型的convertView发送到getView
public View getView(int position, View convertView, ViewGroup patent) ...
但是getItemViewType返回了正确的类型。
public int getItemViewType(int position)
所以我看到的东西看起来像这样
给我位置1的类型 - >返回正确的类型(比如1)
给我一个位置1的视图,其中包含错误类型的内容视图(比如类型2。)
有什么想法吗?
答案 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)
我遇到了同样的问题,导致了崩溃或意外行为 这就是我如何解决我的问题:
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