-5

Here is my xml layout file in which i use scrollview as parent in which list view lost their scrolling property..please suggest me what to do.. why listview lost their property of scrolling by default

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

Please help me!

kunal
  • 124
  • 12

3 Answers3

1

As defined here..

You shouldn't put a ListView inside a ScrollView because the ListView class implements its own scrolling and it just doesn't receive gestures because they all are handled by the parent ScrollView. I strongly recommend you to simplify your layout somehow. For example you can add views you want to be scrolled to the ListView as headers or footers.

Community
  • 1
  • 1
Saurabh Vardani
  • 1,810
  • 2
  • 16
  • 32
1

If you want to use ListView just use Co-Ordinator layout as root and design your layout according to that.

You can also add header on ListView like this:

LayoutInflater inflater = getLayoutInflater();
ViewGroup headerView = (ViewGroup)inflater.inflate(R.layout.header, 
listview, false);
myListView.addHeaderView(headerView, null, false);
Harsh Mittal
  • 423
  • 3
  • 10
1

The shortest & easiest solution for the ListView inside a ScrollView problem.

You do not have to do anything special in layout.xml file nor handle anything on the parent ScrollView. You only have to handle the child ListView. You can also use this code to use any type of child view inside a ScrollView & perform Touch operations.

Just add these lines of code in your java class :

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

If you put ListView inside a ScrollView then all the ListView does not stretch to its full height. Below is a method to fix this issue.

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

To use this method just pass the ListView inside this method :

ListView list = (ListView) view.findViewById(R.id.ls);
setListViewHeightBasedOnChildren(list);
kunal
  • 124
  • 12