首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >动态更新ListView的视图类型

动态更新ListView的视图类型
EN

Stack Overflow用户
提问于 2012-10-21 18:16:36
回答 2查看 2.6K关注 0票数 5

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

我需要在运行时替换适配器的一些视图。Romain Guy说"...changing视图类型动态计数是一个很大的错误“(参见ArrayAdapter and ListView - ArrayIndexOutOfBoundsException)。当视图类型计数动态变化时,正确的方法是什么?

AdapterCode:

代码语言:javascript
运行
AI代码解释
复制
...
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();
}
...

我在更改数据后更新了项目类型列表,但它不能按预期工作。

上面的代码会导致ArrayIndexOutOfBounds异常:

代码语言:javascript
运行
AI代码解释
复制
10-21 20:18:16.231: E/AndroidRuntime(4475): java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
10-21 20:18:16.231: E/AndroidRuntime(4475):     at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6437)
10-21 20:18:16.231: E/AndroidRuntime(4475):     at android.widget.ListView.layoutChildren(ListView.java:1559)
10-21 20:18:16.231: E/AndroidRuntime(4475):     at android.widget.AbsListView.onLayout(AbsListView.java:2102)
10-21 20:18:16.231: E/AndroidRuntime(4475):     at se.davison.sodatools.widget.SectionListView.onLayout(SectionListView.java:147)
10-21 20:18:16.231: E/AndroidRuntime(4475):     at android.view.View.layout(View.java:13754)
10-21 20:18:16.231: E/AndroidRuntime(4475):     at android.view.ViewGroup.layout(ViewGroup.java:4362)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-21 19:37:12

通过https://stackoverflow.com/users/493939/luksprog的建议解决

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

代码语言:javascript
运行
AI代码解释
复制
@Override
public int getViewTypeCount() {
    return 20;
}
票数 1
EN

Stack Overflow用户

发布于 2012-10-21 19:48:43

我认为这里有问题:

代码语言:javascript
运行
AI代码解释
复制
@Override
public int getViewTypeCount() 
{
    int size = itemTypes.size();
    return size == 0 ? 1 : size;
}

必须始终返回提供给适配器的数据大小

尝试以下操作:

代码语言:javascript
运行
AI代码解释
复制
@Override
public int getViewTypeCount() 
{
    int size = itemTypes.size();
    return size;
}
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13000708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档