ListView
の概念とその仕組みを理解しようとしています。また、BaseAdapter
を拡張する独自のアダプターを作成しようとしています。たとえばArrayAdapter
には、ListView
を更新するために、すべてのデータを保持する配列リストを更新した後に呼び出す必要があるnotifyDataSetChanged()
メソッドがあります。
しかし、私はBaseAdapter
の独自のサブクラスを作成しています。その方法は私には利用できませんか?このメソッドを実装するにはどうすればよいですか?基本的に、そのメソッドは正確に何をするのか、多分私はその後理解するでしょう。
ArrayAdapter
の場合、ListView
が現在表示している位置を見て、更新後のArrayList
と同じかどうかを確認します?または...
メソッドは次のようになります:
基礎となるデータが変更され、データセットを反映するビューがそれ自体を更新する必要があることを、アタッチされたオブザーバーに通知します。
しかし、それはどのようにそれ自体をリフレッシュしますか?
誰か説明してもらえますか?
私はそれを理解しました。アダプターがどのように起動したのか、どのようにしてデータを取得するのかをどのようにして知ったのか理解できませんでした。 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
への呼び出しを配置し、何が起こっているのかを追跡することで、これをすべて把握しました。
これがListView
sの仕組みを理解し始めたばかりの人に役立つことを願っています。
追伸この例も理解に大いに役立ちました。
[〜#〜] update [〜#〜]
現在、ListViews
は実際には使用されていません。 Androidはビューのリサイクルを行うRecyclerView
とともに出てきましたが、ListView
の基本を理解することはRecyclerView
。
参照用のリンクを次に示します。 https://developer.Android.com/guide/topics/ui/layout/recyclerview
BaseAdapter
は、他のクラスによって「監視」できます。 ListView
setAdapter()
のメソッドを呼び出しているときは、アダプターのregisterDataSetObserver
を呼び出しています。したがって、アダプターは、誰が新しいデータに関心があるかを知っています。
BaseAdapter
here のソースを確認できます。かなり小さいです。
notifyDataSetChanged
isが利用可能であり、基本的にオーバーライドするべきではありません(特別なことは何もしていないので、独自のクラスで再利用してください)。
ListView
がArrayList
に保存されているデータを表示するとします。
ArrayList
の内容を変更した後、データのソースが変更されたことをリストに伝える必要があり、新しいデータを表示するにはそれ自体を再描画する必要があります。
ですから、それがnotifyDatasetChanged()
の出番です。データが変更されたことをListView
に伝えます。新しいデータを表示するには、ListView
を再描画する必要があります。
サブクラスを作成するためにBaseAdapter
を独自に拡張する場合、notifyDataSetChanged()
メソッドも取得します。