28

メソッドadapter.notifyDataSetInvalidated()は何を達成しますか?それに関する文書はありません。

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

4

4 に答える 4

28

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

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

于 2010-07-10T15:50:57.613 に答える
27

これはアダプタの実装によって異なります...ソースコードを見ると、次のことがわかります。

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

これはその実装です:

public void onInvalidated() {
    // Do nothing
}

DataSetObserverは抽象クラスであるため、で何をするかを決定するのはサブクラス次第onInvalidated()です。

于 2010-07-10T15:40:22.667 に答える
19

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

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

コードに従うと、それDataSetObserverは述べられているように抽象的であり、onChanged()/onInvalidated()メソッドはサブクラスによる実装を待って空であることがわかります。

これで話は終わりですが、Androidフレームワークのエンジニアが、何もしない場合にこれらのメソッドを呼び出すように指示し続けるのはなぜですか?少し掘り下げましたが、これにはすでにサブクラスがありDataSetObserverAdapterDataSetObserver抽象クラス( andなどのAdapterViewクラスによって拡張されています)に存在していることがわかりました。このオブザーバーは、Androidによって自動的に作成され、アダプターに登録されます。GridViewListViewsetAdapter()AdapterView

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

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

于 2011-10-12T00:27:02.990 に答える
3

「 listViewの世界」の講義によると、listViewに何も表示されない(つまり空のデータ)たびに使用する必要があります。

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

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

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

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

于 2014-03-22T20:34:04.060 に答える