web-dev-qa-db-ja.com

アンドロイド。 notifyDataSetChanged()メソッドとListViewsはどのように機能しますか?

ListViewの概念とその仕組みを理解しようとしています。また、BaseAdapterを拡張する独自のアダプターを作成しようとしています。たとえばArrayAdapterには、ListViewを更新するために、すべてのデータを保持する配列リストを更新した後に呼び出す必要があるnotifyDataSetChanged()メソッドがあります。

しかし、私はBaseAdapterの独自のサブクラスを作成しています。その方法は私には利用できませんか?このメソッドを実装するにはどうすればよいですか?基本的に、そのメソッドは正確に何をするのか、多分私はその後理解するでしょう。

ArrayAdapterの場合、ListViewが現在表示している位置を見て、更新後のArrayListと同じかどうかを確認します?または...

メソッドは次のようになります:

基礎となるデータが変更され、データセットを反映するビューがそれ自体を更新する必要があることを、アタッチされたオブザーバーに通知します。

しかし、それはどのようにそれ自体をリフレッシュしますか?

誰か説明してもらえますか?

56
AndreiBogdan

私はそれを理解しました。アダプターがどのように起動したのか、どのようにしてデータを取得するのかをどのようにして知ったのか理解できませんでした。 BaseAdapterクラスを拡張したとき、そのクラスのコンストラクターで、ListViewに表示したいアイテムのリストを初期化しました。しかし、これらの値がどのようにいつ使用されるかはわかりませんでした。

だからここにあるもの!!! :

BaseAdapterには、オーバーライドする必要のあるメソッドがいくつかあります。これらの中には、getCount()があります。

ListViewが作成されたときに、getCount()を呼び出します。これが0以外の値を返す場合(コンストラクターで以前に初期化したArrayListのサイズを返した場合)、getView()を呼び出して画面を項目でいっぱいにします。 instanceでは、ArrayListを20項目で初期化しました。最初に画面に収まるのは8項目のみであるため、getView()は8回呼び出され、そのたびに戻る必要がある位置を求めました(より正確には、リストの行がどのように見えるかを知りたいその特定の位置、どのデータを含める必要があるか)。リストを下にスクロールすると、getView()が何度も何度も呼び出されます。リストの最後に達するまで、私の場合は20アイテム/行です。

notifyDataSetChanged()が行うことは...呼び出されると、呼び出し時に画面に表示されるアイテム(より正確にはどの行インデックス)を調べ、それらの位置でgetView()を呼び出します。

ieリストの最初の8項目を表示しているため(画面に表示される項目)、2番目の項目の間に別の項目を追加する場合リストの3番目の項目でnotifyDataSetChanged()を呼び出すと、getView()が8回呼び出されます。位置は0から始まり、7で終わります。getView()メソッドでは、 ArrayListからデータを再取得すると、リストに挿入された新しい項目を前の8つのうち7つと一緒に自動的に返します(最後の項目が1つ下に移動したため、8ではなく7です。 )、およびListViewはこれらのアイテムで再描画、または何でもします。

また、getView()を正しく実装すると、新しいアイテムを作成する代わりに、すでに表示されているアイテム(オブジェクト)をリサイクルすることになります。 このビデオを参照して、正しいことを確認してくださいgetView()を実装する方法

すべてのメソッドでLogCatへの呼び出しを配置し​​、何が起こっているのかを追跡することで、これをすべて把握しました。

これがListViewsの仕組みを理解し始めたばかりの人に役立つことを願っています。

追伸この例も理解に大いに役立ちました。

[〜#〜] update [〜#〜]

現在、ListViewsは実際には使用されていません。 Androidはビューのリサイクルを行うRecyclerViewとともに出てきましたが、ListViewの基本を理解することはRecyclerView

参照用のリンクを次に示します。 https://developer.Android.com/guide/topics/ui/layout/recyclerview

183
AndreiBogdan

BaseAdapterは、他のクラスによって「監視」できます。 ListViewsetAdapter()のメソッドを呼び出しているときは、アダプターのregisterDataSetObserverを呼び出しています。したがって、アダプターは、誰が新しいデータに関心があるかを知っています。

BaseAdapterhere のソースを確認できます。かなり小さいです。

notifyDataSetChangedisが利用可能であり、基本的にオーバーライドするべきではありません(特別なことは何もしていないので、独自のクラスで再利用してください)。

13
Dmitry Zaytsev

ListViewArrayListに保存されているデータを表示するとします。

ArrayListの内容を変更した後、データのソースが変更されたことをリストに伝える必要があり、新しいデータを表示するにはそれ自体を再描画する必要があります。

ですから、それがnotifyDatasetChanged()の出番です。データが変更されたことをListViewに伝えます。新しいデータを表示するには、ListViewを再描画する必要があります。

9
Swayam

サブクラスを作成するためにBaseAdapterを独自に拡張する場合、notifyDataSetChanged()メソッドも取得します。

0
Rupali Zambad