2015-12-01 5 views
0

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

Мой ListView Item 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 не отрегулируйте и сделайте мой последний элемент в ListView исчезающим. скриншоте выглядит так:

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

Но результат, как этот enter image description here

Я вижу здесь: Android: Listview in ScrollView with dynamic height

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

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

Нужна помощь для решения этой проблемы.

+0

вы можете поделиться представление XML-элемента списка? – Ajitha

+0

@Ajitha Я уже добавляю свои элементы списка xml, не могли бы вы помочь мне решить эту проблему? – Dirus

ответ

1

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

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

+0

Я уже пытаюсь решить проблему раньше .. но как ее использовать, когда я изменяю свой editText? Я написал этот 'setListViewHeightBasedOnChildren (listView)' внутри EditText TextWatcher? – Dirus

+0

Используйте его везде, где вы обновляете содержимое списка. – Jas

+0

Я уже пытаюсь поместить его в 'public void afterTextChanged (Editable s)', но все тот же .. мой ListView может настроить высоту автоматически. Не попал ли я в неправильное место? – Dirus

0

Используйте следующий класс

общественного класса ListViewUtil { частных статических конечной строки 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); 
Смежные вопросы