5

カスタムアダプタの実装を作成しました。このアダプタには、いくつかの異なるビュータイプもあります。

実行時にアダプタの一部のビューを置き換える必要があります。Romain Guyは、「...ビュータイプカウントを動的に変更することは大きな間違いです」と述べています(ArrayAdapterおよびListView --ArrayIndexOutOfBoundsExceptionを参照)。ビュータイプの数が動的に変化するので、これを行う正しい方法は何ですか?

AdapterCode:

...
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例外が発生します。

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)
4

2 に答える 2

1

https://stackoverflow.com/users/493939/luksprogからの提案で解決

これらのメソッドを変更し、initListにitemTypesの新しいインスタンスを作成しませんでした

@Override
public int getViewTypeCount() {
    return 20;
}
于 2012-10-21T19:37:12.167 に答える
-4

ここに問題があると思います:

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

アダプタに提供されたデータのサイズを常に返す必要があります

次のことを試してください:

@Override
public int getViewTypeCount() 
{
    int size = itemTypes.size();
    return size;
}
于 2012-10-21T19:48:42.733 に答える