Adapter.notifyDataSetInvalidated()メソッドは何を実行しますか?それに関するドキュメントはありません。
ListViewを再ロードしようとしていますが、notifyDataSetChangedまたはnotifyDataSetInvalidatedは何も実行しないようです。
それはアダプターの実装に依存します...ソースコードを見ると、次のことがわかります。
notifyDataSetInvalidated()
はDataSetObservable
クラスのnotifyInvalidated()
を呼び出します( ここを参照 )notifyInvalidated()
はDataSetObserver
ごとにonInvalidated()
メソッドを呼び出します( ここを参照 )。onInvalidated()
何もしない ...これはその実装です:
_public void onInvalidated() {
// Do nothing
}
_
DataSetObserver
は抽象クラスなので、onInvalidated()
で何をするかはサブクラスが決定します。
私の知る限り、notifyDataSetInvalidated()
メソッドは、アダプターがデータにアクセスするのを停止します(無効、使用不可などの場合)。 notifyDataSetChanged()
メソッドはListView
を更新して、追加された新しいデータを表示できるようにしますが、UIスレッドで呼び出す必要があります。
それは私が見るのに大いに役立ちました このビデオ -それらがそれらの方法に言及し、それらを正しく使用する方法を説明する2つのセクションがあります。多分それはあなたにも役立ちます:)
私は最近この質問に遭遇し、notifyDataSetChanged()
とnotifyDataSetInvalidated()
を呼び出したときに何が起こっているかをプログラムで疑問に思っている人のために詳しく説明したいと思いました。 *簡単な回答、行きます ここ
@Cristianが彼の回答で述べたように、これらの通知メソッドをアダプターで呼び出すと、基本的にはいくつかのクラスを呼び出し、アダプターに登録されているDataSetObserver
sでonChanged()
/onInvalidated()
を呼び出します。
コードに従うと、実際には DataSetObserver
は前述のように抽象的であり、onChanged()
/onInvalidated()
メソッドは空であり、サブクラスによる実装を待機しています。
これが物語の終わりである場合、なぜAndroidフレームワークエンジニアは何もしない場合にこれらのメソッドを呼び出すように指示し続けるのはなぜですか?少し調べましたが、このDataSetObserver
のサブクラス AdapterDataSetObserver
がすでに存在し、抽象クラス AdapterView
(GridView
やListView
などのクラスによって拡張されています)に存在していることがわかりました)。このオブザーバーは、AdapterView
に対して setAdapter()
を実行すると、Androidによって自動的に作成され、アダプターに 登録済み を取得します。
これらのメソッドが実際に実行するすべてのクレイジーなものを見ることができるのはここです。ドキュメントは貧弱で、最初はこれらの機能を実現するために独自のサブクラス化されたDataSetObserver
を登録する必要があると思いましたが、すでに作成されていることがわかりました。
*便利だと思ったもの:(デフォルトのものに加えて)複数のDataSetObserver
をアダプタに登録できると思います。これにより、必要に応じて追加の作業を行うことができます(ビットマップのダウンロードが完了したときに、プログレスバービューをイメージビューと交換するなど)。
" theworld of listView "講義によると、listViewに何も表示されない(つまり、空のデータ)。
彼らが話している1つの例は、フィルタリングがいつ行われるか( "publishResults"メソッドで)です。講義動画では36:00です。
奇妙なことは、なぜそれをnotifyDataSetChangedとマージしないのですか?アイテムの数をチェックし、それ自体を呼び出すことを決定することができます...
私の見たところによると、講義で話された内容は正しくありません。アダプターが以前にコンテンツを表示していて、現在は何も含まれておらず、今ではnotifyDataSetInvalidatedを呼び出した場合、何も起こらないのでコンテンツは保持されるため、データが変更されない場合にのみnotifyDataSetInvalidatedを使用しても安全だと思います。 。
たとえば、フィルタリングを処理して、以前と同じ結果が得られる場合(結果の数を確認するだけで十分な場合)、notifyDataSetChangedの代わりにnotifyDataSetInvalidatedを呼び出すことができます。