I am trying to create a layout with a header, a banner below it, and then a couple of ListView under the banner. I want the the complete screen to be scrollable except the header. Now I know that ListView does not scroll within a ScrollView so I have set the height of the ListView big enough to show all the items. The problem is that, even after these changes, I see that the ListView is scrolling independently and the complete screen is not scrollable.
`
<include
android:id="@+id/logo_header"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
layout="@layout/screen_header" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_weight="0.8"
android:background="#f2f2f2">
<include
android:id="@+id/mcUser"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
layout="@layout/complaint_reporters_details"
android:layout_weight="2" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:weightSum="9"
android:layout_weight="2">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1"
android:layout_weight="3"
android:focusableInTouchMode="false"
android:paddingLeft="30dp"
android:paddingRight="30dp">
<ImageView android:id="@+id/mcShowList"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:scaleType="fitXY"
android:src="@drawable/list_icon"
android:layout_weight="0.2" />
<TextView android:id="@+id/mcShowList_label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textStyle="bold"
android:textSize="12sp"
android:textColor="#929292"
android:maxLines="1"
android:text="List"
android:layout_weight="0.8"
android:layout_marginTop="-8dp" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1"
android:layout_weight="3"
android:gravity="center_vertical|center_horizontal"
android:paddingLeft="30dp"
android:paddingRight="30dp">
<ImageView android:id="@+id/mcShowMap"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:scaleType="fitXY"
android:src="@drawable/map_view"
android:layout_weight="0.2"/>
<TextView android:id="@+id/mcShowMap_label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textStyle="bold"
android:textSize="12sp"
android:textColor="#929292"
android:maxLines="1"
android:text="Map"
android:layout_weight="0.8"
android:layout_marginTop="-8dp" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1"
android:layout_weight="3"
android:focusableInTouchMode="false"
android:paddingRight="30dp"
android:paddingLeft="30dp">
<ImageView android:id="@+id/mcShowAnalytics"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:scaleType="fitXY"
android:src="@drawable/analytics_icon"
android:layout_weight="0.2" />
<TextView android:id="@+id/mcShowAnalytics_label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textStyle="bold"
android:textSize="12sp"
android:textColor="#929292"
android:maxLines="1"
android:text="Analytics"
android:layout_weight="0.8"
android:layout_marginTop="-10dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:layout_weight="0.2"
android:layout_width="fill_parent"
android:layout_height="400dp">
<FrameLayout
android:id="@+id/mcMapContainer"
android:layout_width="match_parent"
android:layout_height="fill_parent"/>
<LinearLayout
android:id="@+id/mcAnalyticsContainer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/mcChartContainer"
android:layout_gravity="center"
android:layout_width="200dp"
android:layout_height="200dp"/>
<GridView
android:id="@+id/mcAmenityList"
android:layout_height="0dp"
android:layout_weight="7"
android:layout_width="match_parent"
android:numColumns="3"/>
</LinearLayout>
<LinearLayout
android:id="@+id/mcListContainer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<TextView
android:text="Open Complaints"
android:textColor="@color/red_btn_bg_color"
android:textSize="18dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:padding="5dp" />
<ListView
android:id="@+id/mcListOpen"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:text="Closed Complaints"
android:textColor="@color/red_btn_bg_color"
android:textSize="18dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:padding="5dp" />
<ListView
android:id="@+id/mcListClosed"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</ScrollView>
`
Change height of scroll view from match_parent to wrap_content. Because scroll view only enable scrolling if its total height is more than the height of parent view. i.e. replace
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
with this code:
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true">
I've used the following method several times on several apps. I use a special subclass of ListView:
package com.yourcompany.appname.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ListView;
public class NonScrollableListView extends ListView {
public NonScrollableListView(Context context) {
super(context);
}
public NonScrollableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NonScrollableListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected 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();
}
}
Then in your layout, instead of using 's, use something like this:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.yourcompany.appname.views.NonScrollableListView
android:id="@+id/listId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With