Android 动态更新ListView的视图类型

Android 动态更新ListView的视图类型,android,android-listview,android-adapter,android-adapterview,Android,Android Listview,Android Adapter,Android Adapterview,我已经创建了一个自定义适配器实现。我在这个适配器中也有一些不同的视图类型 我需要在运行时替换适配器的一些视图。Romain Guy说“…动态更改视图类型计数是一个很大的错误”(请参阅)。当视图类型计数动态变化时,正确的方法是什么 适配器代码: ... private List<Class<?>> itemTypes = new ArrayList<Class<?>>(20); private void initList(List<Objec

我已经创建了一个自定义适配器实现。我在这个适配器中也有一些不同的视图类型

我需要在运行时替换适配器的一些视图。Romain Guy说“…动态更改视图类型计数是一个很大的错误”(请参阅)。当视图类型计数动态变化时,正确的方法是什么

适配器代码:

...
private List<Class<?>> itemTypes = new ArrayList<Class<?>>(20);

private void initList(List<Object> items) {
    itemTypes = new ArrayList<Class<?>>(20);
    positionSection = new SparseArray<Integer>(items.size());

    int count = 0;
    int sectionIndex = -1;
    for (Object object : items) {
        Class<?> currentClass = object.getClass();
        if (object instanceof String) {
            sectionIndex = count;
        }
        if (!itemTypes.contains(currentClass)) {
            itemTypes.add(currentClass);
        }
        positionSection.put(count, sectionIndex);
        count++;
    }
}
@Override
public int getItemViewType(int position) {
    return itemTypes.indexOf(items.get(position).getClass());
}

@Override
public int getViewTypeCount() {
    int size = itemTypes.size();
    return size == 0 ? 1 : size;
}

@Override
public void notifyDataSetChanged() {
    initList(items);
    super.notifyDataSetChanged();
}
...

根据来自的建议解决

更改了这些方法,并且没有在initList中创建itemTypes的新实例

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

我认为这里有一个问题:

@Override
public int getViewTypeCount() 
{
    int size = itemTypes.size();
    return size == 0 ? 1 : size;
}
必须始终返回提供给适配器的数据大小

请尝试以下操作:

@Override
public int getViewTypeCount() 
{
    int size = itemTypes.size();
    return size;
}

您不能修改
getViewTypeCount
的值,因为该方法对于适配器只调用一次(如果我没有弄错的话),但您可以使它返回一个值,您知道该值将适合适配器将使用的最大类型数(例如50)。但是如果
itemTypes
列表中的顺序发生变化,我更关心的是改变返回的类型和它在
getItemViewType
中指向的类之间的关联。啊,这就成功了!!!非常感谢你!事实并非如此。数据的大小与我的视图类型的大小不同。@死鱼请查看Luksprog对我的原始问题的评论
@Override
public int getViewTypeCount() 
{
    int size = itemTypes.size();
    return size;
}