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()

Source: https://habr.com/ru/post/J125107/


All Articles