2016-10-21 5 views
-5

Вот мой файл макета xml, в котором я использую scrollview как родительский, в котором вид списка потерял свое свойство прокрутки..пожалуйста, предложите мне, что делать .. почему listview потерял свойство прокрутки по умолчаниюScrollview не работает над списком с другим видом

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:fillViewport="true" 
       android:layout_height="match_parent">  
       <RelativeLayout 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"> 
         <TextView 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_alignParentRight="true" 
          android:layout_centerHorizontal="true" 
          android:layout_marginRight="10dp" 
          android:text="Edit Order" 
          android:layout_marginTop="5dp" 
          android:id="@+id/txtyourOrder" 
          android:textColor="@android:color/holo_green_dark" />  
         <TextView 
          android:id="@+id/textView" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="Your Order" 
          android:layout_marginLeft="10dp" 
          android:textColor="@android:color/black" 
          android:textSize="20sp" />   
        <View 
         android:id="@+id/view1" 
         android:layout_below="@id/txtyourOrder" 
         android:layout_width="match_parent" 
         android:layout_height="0.5dp" 
         android:layout_marginTop="10dp" 
         android:background="@android:color/darker_gray" /> 
        <ListView 
         android:layout_below="@id/view1" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:nestedScrollingEnabled="true" 
         android:layout_marginTop="10dp" 
         android:id="@+id/listview" 
         android:textColor="@android:color/darker_gray" />   
        <TextView 
         android:layout_below="@id/listview" 
         android:id="@+id/txtAddItems" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:gravity="center_horizontal" 
         android:layout_marginTop="10dp" 
         android:text="Add Items" 
         android:textColor="@android:color/holo_green_dark" /> 

       </android.support.v4.widget.NestedScrollView> 

Пожалуйста, помогите!

ответ

1

Кратчайший & простым решением для ListView внутри проблемы Scrollview.

Вам не нужно ничего делать в файле layout.xml и не обрабатывать ничего на родительском ScrollView. Вам нужно только обработать дочерний ListView. Вы также можете использовать этот код для использования любого вида дочернего вида внутри ScrollView & выполнять операции касания.

Просто добавьте эти строки кода в классе Java:

ListView lv = (ListView) findViewById(R.id.layout_lv); 
lv.setOnTouchListener(new OnTouchListener() { 
    // Setting on Touch Listener for handling the touch inside ScrollView 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    // Disallow the touch request for parent scroll on touch of child view 
    v.getParent().requestDisallowInterceptTouchEvent(true); 
    return false; 
    } 
}); 

Если поместить ListView внутри ScrollView то все ListView не вытягивается на полную высоту. Ниже приведен метод устранения этой проблемы.

/**** Method for Setting the Height of the ListView dynamically. 
**** Hack to fix the issue of not showing all the items of the ListView 
**** when placed inside a ScrollView ****/ 
public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) 
     return; 

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED); 
    int totalHeight = 0; 
    View view = null; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     view = listAdapter.getView(i, view, listView); 
     if (i == 0) 
      view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT)); 

     view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += view.getMeasuredHeight(); 
    } 
    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
} 

Чтобы использовать этот метод просто передать ListView внутри этого метода:

ListView list = (ListView) view.findViewById(R.id.ls); 
setListViewHeightBasedOnChildren(list); 
1

Как определено here ..

Вы не должны поместить ListView внутри ScrollView, потому что класс ListView реализует свой собственный скроллинг, и он просто не получает жесты, потому что все они обрабатываются родителем Scrollview. Я настоятельно рекомендую вам как-то упростить ваш макет. Например, вы можете добавлять просмотры, которые хотите прокрутить в ListView в виде верхних или нижних колонтитулов.

+1

спасибо сэр за ваше руководство ... – kunal

1

Если вы хотите использовать ListView, просто используйте компоновку Co-Ordinator как root и создайте свой макет в соответствии с этим.

Вы также можете добавить заголовок на ListView, как это:

LayoutInflater inflater = getLayoutInflater(); 
ViewGroup headerView = (ViewGroup)inflater.inflate(R.layout.header, 
listview, false); 
myListView.addHeaderView(headerView, null, false); 
Смежные вопросы