プロジェクトでの作業では、このタイプのレイアウトを描く必要がありました。トピックの詳細はコンパクトブロックの上にあり、その下にはこのトピックに関するコメントのリストがあります。 最初は自然な方法で実装されました。トピックのレイアウトの詳細で、その下にリストがあります。 その後、TKが変更され、リストに沿ってタイトルをスクロールする必要があることがわかりました。
最初の衝動は、タイトルが
言うことをすることでした:
ScrollViewの中に
ListViewを
置きます。 結果として得られたものが正しく表示されなかったため、Googleをより深く掘り下げました。
ネットワーク上の多くの場所(例:
https :
//groups.google.com/forum/#!topic /
android-beginners /
LRpLgGOy2Pcまたはここ:
http :
//stackoverflow.com/questions/1526831/android-scrollview- layout-problem )は、これができないことを直接述べています。 このようなことを実装するために、
ListViewには通常のヘッダーがあります。
ヘッダーを追加するには、
ListViewクラスのメソッドを呼び出します。
public void addHeaderView (View v)
View vは任意の方法で作成できます(明示的にコンストラクターを呼び出すか、インフレータを使用して)。
View hv = ...;
listView.addHeaderView(hv);
ListViewタイトルには
複数のタイトルを
含めることができます。 ちなみに、その量に関連するもう1つの特性があります。デフォルトでは、ヘッダーも通常のリストアイテムと同様にクリック可能です。ヘッダーをクリックすると、
setOnItemClickListenerおよび
setOnItemLongClickListenerの呼び出しで指定されたライナー
が機能するため、クリックされた要素の
位置は
位置パラメーターのライナーに渡されます。ヘッダーの数だけシフトされます。 この事実は、処理中にライナーで考慮する必要があります。 これを行うために、
ListViewには次のメソッドがあります。
int getHeaderViewsCount()
リストヘッダーの数を返します。 たとえば、返される値によって、内部データリストに配置する前に、lisnerで取得した
位置の値を減らすことができます。
protected OnItemClickListener itemClickListener = new OnItemClickListener() {
public void onItemClick(final AdapterView<?> l, final View v, final int position, final long id) {
MyItem myItem = myItems.get(position - listView.getHeaderViewsCount());
// do something to myItem
}
};
ヘッダーを追加するには、もう少し複雑な別の方法があります。
public void addHeaderView (View v, Object data, boolean isSelectable)
これは、見出しをクリック不可にする機能を提供します。3番目のパラメーターに
falseを渡すと、見出しをクリックすると、リストは機能しません
onItemClickListener 。 このようなヘッダー内にあるビューに設定されたリスナーは、正常に機能します。 ただし、この場合でも、タイトルはクリックできないにもかかわらず、
位置の要素の番号付けでは、要素の存在が考慮されます。
View hv = ...;
listView.addHeaderView(hv, null, false);
完全を
期すために、2番目のパラメーター(
Object data )の意味はドキュメントからあまり明確ではありませんが、
Adapter.getItem()メソッドによって返されるデータを実際に設定すると
言います( http://stackoverflow.com/questions/ 4311693 / add-headerview-in-the-class-listview-doで2番目のパラメーターを実行します )。
リストには、フッター用の同様のメソッドセットもあります。
void addFooterView(View v)
void addFooterView(View v, Object data, boolean isSelectable)
int getFooterViewsCount()