2013-09-25 3 views
14

Я использовал пользовательский список. Содержимое происходит от динамического, я хочу, чтобы высота же списка была такой же, как и содержимое.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> 

список Item

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

выхода, как показано ниже, я не хочу так же, как содержание в настоящее время нет Scrollview

enter image description here

+0

Try давая андроида: layout_height как match_parent и посмотреть, если что помогает. –

+0

Он не имеет никакого отношения к виду списка и его содержимому. ваш макет настроен правильно. Это связано с родителями вашего списка. – hasan83

+0

Возможный дубликат [Как я могу поместить ListView в ScrollView без его свертывания?] (Http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview- без-обрушения) – Lennart

ответ

-2

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

+0

Не работает !!!!!! – Nick

+0

Какой родительский макет вы использовали? –

+0

проверить обновленный код – Nick

0

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

7

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

+0

Спасибо, я искал решение за 4 часа :) – patrickandroid

+0

@paddydub: Я рад, что мой ответ вам помог. – VikramV

+0

Это сработало и для меня. –

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

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

Однако, если вы действительно хотите сделать это, вы можете посмотреть на это: How can I put a ListView into a ScrollView without it collapsing?

+1

Спасибо за ваш комментарий! Это заставило меня понять, как неправильно я пытался использовать «ListView», чтобы показывать всегда одни и те же данные без прокрутки (внутри 'ScrollView' тоже)! Теперь с помощью 'LinearLayout'. – danguilherme

24

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

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

Я тестировал и работает на 5.1 –

+0

Сохранено мной! также проверено на 6.0 – MePo

+0

отличный ответ. –

1

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

Как отметил 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(); 
    } 
} 

Новый код: (делают некоторые «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()); 
} 

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()); 
} 
Смежные вопросы