Подтвердить что ты не робот

Listview та же высота, что и контент

Я использовал пользовательский список. Содержимое происходит от динамического, я хочу, чтобы высота же списка была такой же, как и содержимое.

Я использовал wrap_content, но это не помогает. Если я удаляю 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

4b9b3361

Ответ 1

Используйте этот код

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);
    }
}

Ответ 2

Вы не должны помещать ListView внутри ScrollView, потому что ListView сам представляет собой группу представлений, которая отображает список прокручиваемых элементов. Если вы используете его внутри scrollview, он не получит события прокрутки, потому что все они обрабатываются родительским ScrollView. Использование ListView, чтобы сделать его не прокруткой, чрезвычайно дорого и противоречит всей цели ListView. Вы НЕ должны этого делать. Вместо этого используйте LinearLayout.

Однако, если вы действительно хотите это сделать, вы можете взглянуть на это: Как я могу поместить ListView в ScrollView без его свертывания?

Ответ 3

В родительском макете установите высоту в wrap_content. Это должно работать.

Ответ 4

Другие предложения не будут работать, потому что нет способа определить высоту содержимого ListView до тех пор, пока он не будет выведен на экран (если, конечно, у вас нет фиксированной высоты, используйте это также как высоту 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);
}

Ответ 5

Использовать собственный пользовательский ListView
Создайте класс 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>

Ответ 6

Как отмечает Permita, у вас не должно быть ListView в Scrollview. Вместо этого вы должны использовать, например, 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();
    }
}

Новый код: (мы делаем "просмотр списка" -stuff сами, чтобы по возможности использовать представления)

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

UPDATE: Или просто добавьте это к своему адаптеру и вызовите его вместо 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());
}

Ответ 7

попробуйте обернуть просмотр списка с помощью LinearLayout и установить высоту LinearLayout для wrap_content.

Ответ 8

пару вещей, чтобы отметить здесь..

  1. Не используйте ListView внутри ScrollView
  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)
    }

Ответ 9

Используйте android: layout_height = "match_parent", он будет работать, я думаю.