web-dev-qa-db-ja.com

Android AdapterView?

ドキュメント say:

レイアウトのコンテンツが動的であるか事前に決定されていない場合、AdapterViewをサブクラス化するレイアウトを使用して、実行時にレイアウトにビューを設定できます。 AdapterViewクラスのサブクラスは、アダプターを使用してデータをそのレイアウトにバインドします。

しかし、ほとんどのチュートリアルはListViewGridViewSpinnerおよびGalleryについてです。

AdapterViewから直接サブクラスを拡張したいと考えています。コンテンツがアダプターに依存しているというカスタムビューを作成する必要があります。

どのようにこれを行うことができますか、どのメソッドをオーバーライドする必要がありますか?

34
Student Student

最初に、AdapterViewを使用してすべての「動的または事前に決定されていない」ビューを実装できるわけではないため、AdapterViewが目的のものであることを絶対に確認する必要があります。 ViewGroupを拡張するビューを作成した方がよい場合もあります。

AdapterViewを使用する場合は、 この本当に素晴らしい例 をご覧ください。 GitHubにはアダプター付きのカスタムビューがたくさんあります。 これをチェックアウト(ViewGroupを拡張)

25
Leonidos

これはあなたの質問に対する完全な答えではないかもしれませんが、おそらくあなたを導くことができる出発点またはポインタを示しています:

Sony Developerチュートリアル-3D ListView

6
Nezam

ListViewAbsListViewを拡張し、それはAdapterView<ListAdapter>。そのため、このようなカスタムビューを最初から実装する必要がある場合は、これらのクラスのソースコードを確認できます。

しかし、注意してください、それはかなりの仕事です。おそらく、既存のクラスの1つを使用して外観を調整すれば十分かもしれません。

5
Ridcully

AdapterViewから派生しても機能しますが、期待するほど有益ではない場合があります。 AdapterViewによって提供されるインフラストラクチャの一部はパッケージプライベートです。つまり、アクセスできません。

たとえば、AdapterViewは、AbsListViewおよびListViewの選択されたアイテムインデックスを管理します。ただし、setNextSelectedPositionInt(int position)mNextSelectedPositionを設定する唯一のパス)のようなメソッドはパッケージプライベートであるため、それらに到達することはできません。 AbsListViewListViewは同じパッケージ内にあるためそれらに到達できますが、できません。

AdapterViewソースを調べると、setNextSelectedPositionInt()handleDataChanged()から呼び出されていることがわかります。残念ながらhandleDataChanged()もパッケージプライベートであり、 _not_called位置設定を可能にするために活用できるAdapterView内の他の場所から。)

つまり、選択した位置を管理する必要がある場合は、派生クラスでそのインフラストラクチャを再作成する必要があります(または、ListViewまたはAbsListView...から派生する必要がありますが、 AbsListViewに由来する同様の問題に遭遇する疑いがあります。また、アイテムの選択を中心とするAdapterView機能は完全には機能しない可能性が高いことも意味します。

2