63

私はListView概念とそれがどのように機能するかを理解しようとしており、拡張する独自のアダプターを作成しようとしていますBaseAdapter。たとえばArrayAdapternotifyDataSetChanged()すべてのデータを保持する配列リストを更新した後、ListView.

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

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

メソッドは次のように述べています。

接続されたオブザーバーに、基になるデータが変更されたこと、およびデータ セットを反映するすべてのビューがそれ自体を更新する必要があることを通知します。

しかし、それはどのように正確にリフレッシュするのでしょうか?

誰か説明してくれませんか?

4

4 に答える 4

193

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

だからここにあるのです!!! :

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

が作成されると、それ以外の場合ListViewは、を呼び出しますgetCount()。これが0以外の値を返す場合(コンストラクターで以前に初期化したArrayListのサイズを返しました)、getView()画面をアイテムで埋めるのに十分な回数呼び出します。たとえばArrayList、 20個のアイテムで初期化しました。最初は8つのアイテムしか画面に収まらなかったため、getView()8回呼び出され、戻る必要のある位置を尋ねるたびに(より正確には、その特定の位置のリストで行がどのように表示されるか、どのデータかを知りたい)含む必要がありました)。リストを下にスクロールするgetView()と、何度も何度も呼び出されます。'リストの最後に到達するまで、この場合は20アイテム/行です。

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

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

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

LogCatすべてのメソッドにを呼び出し、何が起こっているかを追跡することで、これらすべてを理解しました。

これが、sがどのように機能するかを理解し始めたばかりの人に役立つことを願っていますListView

PSこの例は、私が理解するのにも大いに役立ちました。

アップデート

今日ListViewsはもう実際には使われていません。AndroidRecyclerViewは、ビューのリサイクルを行うものを発表しましたが、の基本を知っていると、ListViewを理解するのに役立ちますRecyclerView

参考のためのリンクは次のとおりです:https ://developer.android.com/guide/topics/ui/layout/recyclerview

于 2012-09-02T08:34:10.317 に答える
13

BaseAdapter他のクラスから「観察」できます。メソッドを呼び出すときは、アダプターListView setAdapter()の呼び出しです。registerDataSetObserverしたがって、アダプターは、誰が新しいデータに関心を持っているかを認識しています。

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

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

于 2012-09-01T17:52:49.953 に答える
10

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

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

そこで、ここで問題が発生notifyDatasetChanged()します。これはListView、データが変更されたことを示しています。新しいデータを表示するには、をListView再描画する必要があります。

于 2012-09-01T17:33:10.053 に答える
0

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

于 2016-12-08T09:28:05.770 に答える