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