web-dev-qa-db-ja.com

コンテンツと同じ高さのリストビュー

私はカスタムリストビューを使用しました。コンテンツは動的です。コンテンツと同じリストビューの高さにしたいのです。

私はwrap_contentを使用しましたが、これは役に立ちませんIf私はscrollviewを削除してからその作業をします

コード。 "垂直方向にスクロールするScrollViewには、別の垂直方向にスクロールするウィジェット(ListView)を含めないでください"

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@drawable/background_img"
    Android:scrollbars="none" >

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

<ListView
            Android:id="@+id/lstsemtrack"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
        Android:divider="#f2e4e4"
        Android:dividerHeight="1dip"
             >
        </ListView>

アイテムリスト

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:padding="10dip"
    Android:scrollbars="none" >

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"
        Android:weightSum="4" >

        <TextView
            Android:id="@+id/txtBiology"
            style="@style/sem_rowtext"
            Android:layout_width="0dip"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_vertical"
            Android:layout_marginRight="5dip"
            Android:layout_weight="1"
            Android:text="Biology" />

        <TextView
            Android:id="@+id/txtClass"
            style="@style/sem_rowtext"
            Android:layout_width="0dip"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:text="Biology - 101" />

        <TextView
            Android:id="@+id/txtGrade"
            style="@style/sem_rowtext"
            Android:layout_width="0dip"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:text="Grade" />

        <TextView
            Android:id="@+id/txtGrade"
            style="@style/sem_rowtext"
            Android:layout_width="0dip"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:text="Remove" />
    </LinearLayout>

</LinearLayout>

以下のような出力私はコンテンツと同じようにスクロールビューなしにしたい

enter image description here

16
Nick

このコードを使用

public class MyListView  extends ListView {

    public MyListView  (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView  (Context context) {
        super(context);
    }

    public MyListView  (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}
38
Raj008

ListView自体はスクロール可能なアイテムのリストを表示するビューグループであるため、ListViewをScrollView内に配置しないでください。 scrollview内で使用した場合、スクロールイベントはすべて親ScrollViewによって処理されるため、イベントを受け取りません。 ListViewを使用してスクロールしないようにすることは非常にコストがかかり、ListViewの目的全体に反します。これを行うべきではありません。代わりに、LinearLayoutを使用してください。

ただし、本当にこれを実行したい場合は、これを確認できます。 ListViewをScrollViewに折りたたみせずに配置するにはどうすればよいですか?

12
Permita

親レイアウトで、高さをwrap_contentに設定します。これはうまくいくはずです。

8
VikramV

画面に描画されるまでは、ListViewのコンテンツの高さを決定する方法がないため、他の提案は機能しません(もちろん、高さが固定されている場合を除き、それをListViewの高さとしても使用します)。

あなたができることは、リストビューの高さを、その中に要素を描画した後に設定することです。アクティビティのonWindowFocusChangedでこれを行うことができます。例として:

public void onWindowFocusChanged(boolean hasFocus) {
    // get content height
    int contentHeight = listView.getChildAt(0).getHeight();

    // set listview height
    LayoutParams lp = listView.getLayoutParams();
    lp.height = contentHeight;
    listView.setLayoutParams(lp);
}
4
josephus

独自のカスタムリストビューを使用する
クラスCustomListView.Javaを作成し、ListViewを次のように拡張します。

public class CustomListView extends ListView {

private Android.view.ViewGroup.LayoutParams params;
private int prevCount = 0;

public CustomListView(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

@Override
protected void onDraw(Canvas canvas)
{
    if (getCount() != prevCount) 
    {
        int height = getChildAt(0).getHeight() + 1 ;
        prevCount = getCount();
        params = getLayoutParams();
        params.height = getCount() * height;
        setLayoutParams(params);
    }

    super.onDraw(canvas);
}

}

次に、それをxmlで使用します

 <yourPackageName.CustomListView
        Android:id="@+id/lstsemtrack"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:divider="#f2e4e4"
        Android:dividerHeight="1dip">
 </yourPackageName.ListView>
2
user4696837

Permitaによって指摘されているように、ScrollviewにListViewを含めることはできません。たとえば、代わりにLinearLayoutを使用する必要があります。

場合によっては、再利用するカスタムアダプタをすでに作成していることがあります。その場合、これらのコードスニペットが役立つ場合があります。

古いビュー:

...
<ListView Android:id="@+id/myListView" ... />
...

新しいビュー:

...
<LinearLayout
    Android:orientation="vertical"
    Android:id="@+id/myLinearLayout"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" />
...

古いコード:(ダイアログ/フラグメント/アクティビティ内)

YourAdapter listAdapter;
...
ListView listView = (ListView)rootView.findViewById(R.id.myListView);
...
if (listView != null) {
    if (listAdapter == null) {
        listAdapter = new YourAdapter(...);
        listView.setAdapter(listAdapter);
    } else {
        listAdapter.notifyDataSetChanged();
    }
}

新しいコード:(可能な場合はビューを再利用するために、「listview」などを自分で実行します)

YourAdapter listAdapter;
...
LinearLayout linearLayout = (LinearLayout) rootView.findViewById(R.id.myLinearLayout);
...
if (linearLayout != null) {
    if (listAdapter == null) listAdapter = new YourAdapter(...);
    for (int pos = 0; pos < listAdapter.getCount(); pos++) {
        View existingView = linearLayout.getChildAt(pos);
        if (existingView != null) listAdapter.getView(pos, existingView, linearLayout);
        else linearLayout.addView(listAdapter.getView(pos, null, linearLayout));
    }
    while (linearLayout.getChildCount() > listAdapter.getCount()) linearLayout.removeViewAt(listAdapter.getCount());
}

更新:または、これをアダプターに追加して、リストビューでsetAdapterの代わりに呼び出し、アダプターでnotifyDataUpdatedを呼び出します。

public void updateOnLinearView(ViewGroup parentView) {
    // Note reusing child views if there are any
    for (int pos = 0; pos < getCount(); pos++) {
        View existingView = parentView.getChildAt(pos);
        if (existingView != null) getView(pos, existingView, parentView);
        else parentView.addView(getView(pos, null, parentView));
    }
    while (parentView.getChildCount() > getCount())
        parentView.removeViewAt(getCount());
}
2
Erik Melkersson

ここで注意すべき点がいくつかあります。

  1. ScrollView内でListViewを使用しないでください
  2. その高さを取得するには、listViewアイテムを動的に計算する必要があります。

これを行う関数です。

public void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }

    int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        if (listItem instanceof ViewGroup)
            listItem.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);

}

あなたは同じで呼び出す必要があります

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
setListViewHeightBasedOnChildren(listview)
    }
0
Smaran

リストビューをLinearLayoutでラップして、LinearLayoutの高さをwrap_contentに設定してみてください。

0
Gil Moshayof