ListView внутри ScrollView с автоматической регулировкой высоты

Я пытаюсь создать ListView внутри ScrollView с EdiText внутри ListView, Поэтому я использую пользовательский метод, чтобы сделать мой ListView NonScrollable.

Мой элемент ListView xml выглядит так:

<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="15dp"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/title1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLines="3"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        android:paddingTop="3dp"
        android:text="Text"
        android:textColor="#222"
        android:textSize="18sp"
        tools:ignore="HardcodedText" />
    <TextView
        android:id="@+id/title2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_below="@+id/title1"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        android:paddingBottom="2dp"
        android:text="New Text"
        android:textColor="#727272"
        android:textSize="15sp"
        tools:ignore="HardcodedText" />


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title2"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="8dp"
        android:hint="Note"
        android:textSize="13sp"
        android:id="@+id/text_note"/>
</RelativeLayout>

Код пользовательского метода выглядит следующим образом:

public class NonScrollListView extends ListView {

    public NonScrollListView(Context context) {
        super(context);
    }
    public NonScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

Проблема в том, что когда я создаю новую строку в EditText, моя высота списка не корректируется и мой последний элемент в ListView исчезает. Снимок экрана выглядит так:

Это то, что я пытаюсь сделать До

Но результат такой введите описание изображения здесь

Я вижу отсюда: Android: ListView в ScrollView с динамической высотой

Он сказал, что изменение ListView в LinearLayout.. Может кто-нибудь помочь мне, как это сделать? Я понятия не имею, как изменить ListView в LinearLayout,

И если не нужно менять на LinearLayout есть ли способ отрегулировать высоту моего ListView так что мой товар не исчезнет?

Нужна помощь, чтобы решить это.

2 ответа

Попробуйте использовать этот метод:

 public static void setListViewHeightBasedOnChildren(ListView listView) {
            ListAdapter listAdapter = listView.getAdapter(); 
            if (listAdapter == null) {
                // pre-condition
                return;
            }

            int totalHeight = 0;
            for (int i = 0; i < listAdapter.getCount(); i++) {
                View listItem = listAdapter.getView(i, null, listView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }

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

лайк setListViewHeightBasedOnChildren(listView),

Используйте ниже класс

public class ListViewUtil {
    private static final String CNAME = ListViewUtil.class.getSimpleName();

    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }

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

Для вызова метода

ListViewUtil.setListViewHeightBasedOnChildren(lview);
Другие вопросы по тегам