ドキュメント say:
レイアウトのコンテンツが動的であるか事前に決定されていない場合、AdapterViewをサブクラス化するレイアウトを使用して、実行時にレイアウトにビューを設定できます。 AdapterViewクラスのサブクラスは、アダプターを使用してデータをそのレイアウトにバインドします。
しかし、ほとんどのチュートリアルはListView
、GridView
、Spinner
およびGallery
についてです。
AdapterView
から直接サブクラスを拡張したいと考えています。コンテンツがアダプターに依存しているというカスタムビューを作成する必要があります。
どのようにこれを行うことができますか、どのメソッドをオーバーライドする必要がありますか?
最初に、AdapterView
を使用してすべての「動的または事前に決定されていない」ビューを実装できるわけではないため、AdapterView
が目的のものであることを絶対に確認する必要があります。 ViewGroup
を拡張するビューを作成した方がよい場合もあります。
AdapterView
を使用する場合は、 この本当に素晴らしい例 をご覧ください。 GitHubにはアダプター付きのカスタムビューがたくさんあります。 これをチェックアウト(ViewGroup
を拡張) 。
これはあなたの質問に対する完全な答えではないかもしれませんが、おそらくあなたを導くことができる出発点またはポインタを示しています:
ListView
はAbsListView
を拡張し、それはAdapterView<ListAdapter>
。そのため、このようなカスタムビューを最初から実装する必要がある場合は、これらのクラスのソースコードを確認できます。
しかし、注意してください、それはかなりの仕事です。おそらく、既存のクラスの1つを使用して外観を調整すれば十分かもしれません。
AdapterView
から派生しても機能しますが、期待するほど有益ではない場合があります。 AdapterView
によって提供されるインフラストラクチャの一部はパッケージプライベートです。つまり、アクセスできません。
たとえば、AdapterView
は、AbsListView
およびListView
の選択されたアイテムインデックスを管理します。ただし、setNextSelectedPositionInt(int position)
(mNextSelectedPosition
を設定する唯一のパス)のようなメソッドはパッケージプライベートであるため、それらに到達することはできません。 AbsListView
とListView
は同じパッケージ内にあるためそれらに到達できますが、できません。
(AdapterView
ソースを調べると、setNextSelectedPositionInt()
がhandleDataChanged()
から呼び出されていることがわかります。残念ながらhandleDataChanged()
もパッケージプライベートであり、 _not_called
位置設定を可能にするために活用できるAdapterView
内の他の場所から。)
つまり、選択した位置を管理する必要がある場合は、派生クラスでそのインフラストラクチャを再作成する必要があります(または、ListView
またはAbsListView
...から派生する必要がありますが、 AbsListView
に由来する同様の問題に遭遇する疑いがあります。また、アイテムの選択を中心とするAdapterView
機能は完全には機能しない可能性が高いことも意味します。