How can I put a ListView into a ScrollView without it collapsing? How can I put a ListView into a ScrollView without it collapsing? android android

How can I put a ListView into a ScrollView without it collapsing?


Here's my solution. I'm fairly new to the Android platform, and I'm sure this is a bit hackish, especially in the part about calling .measure directly, and setting the LayoutParams.height property directly, but it works.

All you have to do is call Utility.setListViewHeightBasedOnChildren(yourListView) and it will be resized to exactly accommodate the height of its items.

public class Utility {    public static void setListViewHeightBasedOnChildren(ListView listView) {        ListAdapter listAdapter = listView.getAdapter();        if (listAdapter == null) {            // pre-condition            return;        }        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();        for (int i = 0; i < listAdapter.getCount(); i++) {            View listItem = listAdapter.getView(i, null, listView);            if (listItem instanceof ViewGroup) {                listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));             }             listItem.measure(0, 0);             totalHeight += listItem.getMeasuredHeight();        }        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));        listView.setLayoutParams(params);    }}


Using a ListView to make it not scroll is extremely expensive and goes against the whole purpose of ListView. You should NOT do this. Just use a LinearLayout instead.


This will definitely work............
You have to just replace your <ScrollView ></ScrollView> in layout XML file with this Custom ScrollView like <com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >

package com.tmd.utils;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.ScrollView;public class VerticalScrollview extends ScrollView{    public VerticalScrollview(Context context) {        super(context);    }     public VerticalScrollview(Context context, AttributeSet attrs) {            super(context, attrs);        }        public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) {            super(context, attrs, defStyle);        }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        final int action = ev.getAction();        switch (action)        {            case MotionEvent.ACTION_DOWN:                    Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" );                    super.onTouchEvent(ev);                    break;            case MotionEvent.ACTION_MOVE:                    return false; // redirect MotionEvents to ourself            case MotionEvent.ACTION_CANCEL:                    Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" );                    super.onTouchEvent(ev);                    break;            case MotionEvent.ACTION_UP:                    Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" );                    return false;            default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break;        }        return false;    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        super.onTouchEvent(ev);        Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() );         return true;    }}