ScrollView内のListView

プロジェクトでの作業では、このタイプのレイアウトを描く必要がありました。トピックの詳細はコンパクトブロックの上にあり、その下にはこのトピックに関するコメントのリストがあります。 最初は自然な方法で実装されました。トピックのレイアウトの詳細で、その下にリストがあります。 その後、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()






All Articles