web-dev-qa-db-ja.com

Android-adapter.notifyDataSetInvalidatedは何をしますか?

Adapter.notifyDataSetInvalidated()メソッドは何を実行しますか?それに関するドキュメントはありません。

ListViewを再ロードしようとしていますが、notifyDataSetChangedまたはnotifyDataSetInvalidatedは何も実行しないようです。

29
Tawani

それはアダプターの実装に依存します...ソースコードを見ると、次のことがわかります。

  1. notifyDataSetInvalidated()DataSetObservableクラスのnotifyInvalidated()を呼び出します( ここを参照
  2. 次に、notifyInvalidated()DataSetObserverごとにonInvalidated()メソッドを呼び出します( ここを参照 )。
  3. 次に面白い部分があります:onInvalidated()何もしない ...

これはその実装です:

_public void onInvalidated() {
    // Do nothing
}
_

DataSetObserverは抽象クラスなので、onInvalidated()で何をするかはサブクラスが決定します。

27
Cristian

私の知る限り、notifyDataSetInvalidated()メソッドは、アダプターがデータにアクセスするのを停止します(無効、使用不可などの場合)。 notifyDataSetChanged()メソッドはListViewを更新して、追加された新しいデータを表示できるようにしますが、UIスレッドで呼び出す必要があります。

それは私が見るのに大いに役立ちました このビデオ -それらがそれらの方法に言及し、それらを正しく使用する方法を説明する2つのセクションがあります。多分それはあなたにも役立ちます:)

28
lucidd

私は最近この質問に遭遇し、notifyDataSetChanged()notifyDataSetInvalidated()を呼び出したときに何が起こっているかをプログラムで疑問に思っている人のために詳しく説明したいと思いました。 *簡単な回答、行きます ここ

@Cristianが彼の回答で述べたように、これらの通知メソッドをアダプターで呼び出すと、基本的にはいくつかのクラスを呼び出し、アダプターに登録されているDataSetObserversでonChanged()/onInvalidated()を呼び出します。

コードに従うと、実際には DataSetObserver は前述のように抽象的であり、onChanged()/onInvalidated()メソッドは空であり、サブクラスによる実装を待機しています。

これが物語の終わりである場合、なぜAndroidフレームワークエンジニアは何もしない場合にこれらのメソッドを呼び出すように指示し続けるのはなぜですか?少し調べましたが、このDataSetObserverのサブクラス AdapterDataSetObserver がすでに存在し、抽象クラス AdapterViewGridViewListViewなどのクラスによって拡張されています)に存在していることがわかりました)。このオブザーバーは、AdapterViewに対して setAdapter() を実行すると、Androidによって自動的に作成され、アダプターに 登録済み を取得します。

これらのメソッドが実際に実行するすべてのクレイジーなものを見ることができるのはここです。ドキュメントは貧弱で、最初はこれらの機能を実現するために独自のサブクラス化されたDataSetObserverを登録する必要があると思いましたが、すでに作成されていることがわかりました。

*便利だと思ったもの:(デフォルトのものに加えて)複数のDataSetObserverをアダプタに登録できると思います。これにより、必要に応じて追加の作業を行うことができます(ビットマップのダウンロードが完了したときに、プログレスバービューをイメージビューと交換するなど)。

18
Tony Chan

" theworld of listView "講義によると、listViewに何も表示されない(つまり、空のデータ)。

彼らが話している1つの例は、フィルタリングがいつ行われるか( "publishResults"メソッドで)です。講義動画では36:00です。

奇妙なことは、なぜそれをnotifyDataSetChangedとマージしないのですか?アイテムの数をチェックし、それ自体を呼び出すことを決定することができます...

私の見たところによると、講義で話された内容は正しくありません。アダプターが以前にコンテンツを表示していて、現在は何も含まれておらず、今ではnotifyDataSetInvalidatedを呼び出した場合、何も起こらないのでコンテンツは保持されるため、データが変更されない場合にのみnotifyDataSetInvalidatedを使用しても安全だと思います。 。

たとえば、フィルタリングを処理して、以前と同じ結果が得られる場合(結果の数を確認するだけで十分な場合)、notifyDataSetChangedの代わりにnotifyDataSetInvalidatedを呼び出すことができます。

3