Tuesday, January 31, 2017

How to handle ListView inside ScrollView is not scrolling issue on Android

Sometimes we face issue of ListView height if we put ListView inside ScrollView. One more issue comes with this is we are unable to scroll the page. ListView inside ScrollView is a bad practice but there is one solution for it.

Create class as shown below and just use that as a Listview and start binding data to it.
 package com.example.logactivity;  
 import android.content.Context;  
 import android.util.AttributeSet;  
 import android.view.MotionEvent;  
 import android.view.View;  
 import android.view.View.MeasureSpec;  
 import android.view.View.OnTouchListener;  
 import android.view.ViewGroup;  
 import android.view.ViewGroup.LayoutParams;  
 import android.widget.AbsListView;  
 import android.widget.AbsListView.OnScrollListener;  
 import android.widget.ListAdapter;  
 import android.widget.ListView;  
 public class NestedListView extends ListView implements OnTouchListener, OnScrollListener {  
   private int listViewTouchAction;  
   private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;  
   public NestedListView(Context context, AttributeSet attrs) {  
     super(context, attrs);  
     listViewTouchAction = -1;  
     setOnScrollListener(this);  
     setOnTouchListener(this);  
   }  
   @Override  
   public void onScroll(AbsListView view, int firstVisibleItem,  
       int visibleItemCount, int totalItemCount) {  
     if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {  
       if (listViewTouchAction == MotionEvent.ACTION_MOVE) {  
         scrollBy(0, -1);  
       }  
     }  
   }  
   @Override  
   public void onScrollStateChanged(AbsListView view, int scrollState) {  
   }  
   @Override  
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
     int newHeight = 0;  
     final int heightMode = MeasureSpec.getMode(heightMeasureSpec);  
     int heightSize = MeasureSpec.getSize(heightMeasureSpec);  
     if (heightMode != MeasureSpec.EXACTLY) {  
       ListAdapter listAdapter = getAdapter();  
       if (listAdapter != null && !listAdapter.isEmpty()) {  
         int listPosition = 0;  
         for (listPosition = 0; listPosition < listAdapter.getCount()  
             && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) {  
           View listItem = listAdapter.getView(listPosition, null, this);  
           //now it will not throw a NPE if listItem is a ViewGroup instance  
           if (listItem instanceof ViewGroup) {  
             listItem.setLayoutParams(new LayoutParams(  
                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
           }  
           listItem.measure(widthMeasureSpec, heightMeasureSpec);  
           newHeight += listItem.getMeasuredHeight();  
         }  
         newHeight += getDividerHeight() * listPosition;  
       }  
       if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) {  
         if (newHeight > heightSize) {  
           newHeight = heightSize;  
         }  
       }  
     } else {  
       newHeight = getMeasuredHeight();  
     }  
     setMeasuredDimension(getMeasuredWidth(), newHeight);  
   }  
   @Override  
   public boolean onTouch(View v, MotionEvent event) {  
     if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {  
       if (listViewTouchAction == MotionEvent.ACTION_MOVE) {  
         scrollBy(0, 1);  
       }  
     }  
     return false;  
   }  
 }  
Your ListView inside your layout should be:
 <com.example.logactivity.NestedListView  
         android:id="@+id/listView"  
         android:layout_width="match_parent"  
         android:layout_height="match_parent"  
         android:layout_centerHorizontal="true"  
         android:layout_marginBottom="5dp"  
         android:layout_marginTop="5dp"  
         android:divider="@android:color/transparent"  
         android:scrollbars="none" >  
 </com.example.logactivity.NestedListView>  

No comments :

Post a Comment