2

私は自分のアプリケーションの 1 つにcommonsguy / cwac-endless EndlessAdapter を統合していましたが、本当にうまくいきました! CommonsWare卿に感謝します:)

しかし、私は得てjava.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notificationいます。

注: この例外は、 を使用する場合にのみ発生しますendlessAdapter.setRunInBackground(false);。基本的には、独自の実装でAsyncTaskデータをキャッシュする ( EndlessAdapter クラスのメソッドで実行する)AsyncTask場合にのみ発生します。cacheInBackground()

この IllegalStateException を再作成する手順:

ステップ 1)のデモとして提供されているEndlessAdapterCustomTaskFragment 例を実行するEndlessAdapter

ステップ 2) ListView を下にスクロールして、進行状況ビューが表示されるようにします。

ステップ 3) 進行状況ビューをクリックします。データの読み込み中に進行状況ビューをクリックすると、アプリケーションが強制的に閉じられjava.lang.IllegalStateExceptionます。

この問題を克服するために、EndlessAdapterクラスの次のメソッドをオーバーライドすると、実際に機能しました;)

    @Override
    public boolean areAllItemsEnabled() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        // TODO Auto-generated method stub
        return getItem(position) != null;
    }

私は次のことについて非常に興味があります。

EndlessAdapter1)独自の実装でデータをキャッシュしたい場合にのみ実装が例外をスローする理由、AsyncTaskつまり、カスタム実装なしでendlessAdapter.setRunInBackground(false);使用する場合はそうではありませんendlessAdapter.setRunInBackground(true);AsyncTask

2) ListView の進行状況インジケーター項目をクリックした場合にのみ例外が発生するため、ListView項目のクリックとgetCount()メソッドには何らかの関係があります。ListView

前もって感謝します :)

4

1 に答える 1

1

この問題の再現可能なテストケースを提供していただきありがとうございます。この問題に対処するために、上記で概説した/修正EndlessAdapterのバリエーションを組み込むなど、2つの変更を加えました。これはコミットされ、v1.2としてタグ付けされています。ライブラリのv1.2に移行する場合は、およびの独自のオーバーライドを削除する必要があります。areAllItemsEnabled()isEnabled()areAllItemsEnabled()isEnabled()

EndlessAdapter実装が例外をスローするのは、AsyncTaskの独自の実装でデータをキャッシュする必要がある場合のみです。つまりendlessAdapter.setRunInBackground(false); ただし、endlessAdapter.setRunInBackground(true);を使用する場合は使用しないでください。AsyncTaskのカスタム実装なし

例外はonException()、を介して提供され、オーバーライドできます。これは、によって管理されているバックグラウンドスレッドで例外が発生した場合でも、メインアプリケーションスレッドで例外を確実に取得するためですEndlessAdapter

ListViewアイテムをクリックすると、ListViewの進行状況インジケーターアイテムをクリックしたときにのみ例外が生成されるため、ListViewのgetCount()メソッドとの間に何らかの関係があります。

これはの実装にありListViewます。

于 2012-10-27T07:01:42.173 に答える