Listview android - change height after data load dynamically - android

I have a android layout like this:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/headingView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#android:color/white"
android:paddingTop="#dimen/value_5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:id="#+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" >
<LinearLayout
android:id="#+id/linearLayout2"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="#+id/relativeLayout1"
android:layout_centerHorizontal="true"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingTop="5dp"
android:visibility="gone" />
<LinearLayout
android:id="#+id/list_items"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#color/mt_gray_color"
android:fadeScrollbars="false" >
<TextView
android:id="#+id/itemHeading"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textStyle="bold"
android:background="#f2f2f2"
android:layout_marginTop="15dp"
android:visibility="gone"/>
<ListView
android:id="#+id/mylist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="#dimen/value_5dp"
android:minHeight="500dp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
I am loading data dynamically in ListView after this page/fragment has been loaded.
The listview contains more than one element and I was expecting that it will show me list in the listview without scrolls as I have made it WRAP_CONTENT.
I might have wrong understanding and which what I want to understand and find a solution that how can i avoid the scroll bars and have all the items listed in the listview without scrolls.
Thanks in advance.

You could calculate the size off all children of the ListView at runtime and then set it's height to the total height of all the children combined. You can use this method:
public void justifyListView(ListView listView) {
ListAdapter adapter = listView.getAdapter();
if (adapter == null) {
return;
}
ViewGroup vg = listView;
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, vg);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams par = listView.getLayoutParams();
par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
listView.setLayoutParams(par);
listView.requestLayout();
}

You can change the height of listView when the data changed.

Related

Nested Listview only shows first item

I got a fragment in my tablayout displaying a listview:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#color/backgroundColor"
android:fitsSystemWindows="true"
tools:context=".activities.fragments.OrdersFragment">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="#+id/orderListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#color/colorPrimaryDark"
android:dividerHeight="1px" />
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
This Listview has items which have the following layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="#+id/order_list_order"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<ImageView
android:id="#+id/arrowView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_weight="1"
app:srcCompat="#drawable/ic_downarrow" />
<LinearLayout
android:id="#+id/previewLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="#+id/order_list_storename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="Store Name"
android:textColor="#color/generalText"
android:textSize="24sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
some textview here
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
some textview here
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="#+id/extensionLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/previewLayout"
android:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Produkte:"
android:textColor="#color/generalText"
android:textSize="18sp"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="#array/exampleArray"/>
</LinearLayout>
</RelativeLayout>
These items all have also a listview which has the exampleArray as items:
<string-array name="exampleArray">
<item>Donut</item>
<item>Pizza</item>
<item>blabla</item>
</string-array>
My Problem is, that only the first element of this inner listview is shown. Also the outer Listview is not clickable anymore. Does anyone know why this is the case? Am I doing anything wrong?
Its not a good idea to put a scrollable view inside another scrollable view. Try to solve your problem using getItemViewType method.
If you don't have any other option, then you have to measure inner ListView height. This way all item will be inflated at the same time, you can't take advantage of recycle property of ListView.
To measure inner ListView use this method
/**** 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.requestLayout();
}
Usage:
setListViewHeightBasedOnChildren(listView)
This way you inner LisView will lose recycle property.
There is other questions about this, You can check those too,
Check this and this
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">//changed here
<ListView
android:id="#+id/orderListView"
android:layout_width="match_parent"
android:layout_height="match_parent"//and here
android:divider="#color/colorPrimaryDark"
android:dividerHeight="1px" />
</RelativeLayout>
Please use 'match_parent' with 'ListView' else use RecyclerView

Android - Listviews

I wanted to make my ListViews the size of the actual content. For example if there's 20 items I want it to display the 20 items without making the list itself scrollable like it is now.
It looks like this atm: The lists are very small and they are scrollable.
https://i.gyazo.com/eb8902a17936f54a2271b51abe228607.png
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.tiagosilva.amob_android.ArchiveFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Tube Data"
android:textColor="#color/AMOB_yellow"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/tubeData_list">
</ListView>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Tool Data"
android:textColor="#color/AMOB_yellow"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/toolData_list">
</ListView>
<Button
android:id="#+id/btn_clear_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#drawable/round_buttons"
android:text="Clear all"
android:textColor="#color/AMOB_gray"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:gravity="center"/>
</LinearLayout>
</ScrollView>
Try to use this, might be you gotta solution for it :-
Utility.setListViewHeightBasedOnChildren(yourlistview);
add this method :-
public static class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
It will not Scroll but u can get the size of the actual content as you want.

Fixed height and internal scrolling for expanablelistview

I have an expandable listview, which is populated programatically. i want to have fixed length for that expandable listview and have scrolling inside each group not for the whole list.
my layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="#+id/ll_price_list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#color/theme_blue"
android:orientation="horizontal"
android:weightSum="8" >
<TextView
android:id="#+id/tv_pricelisthead_item"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:gravity="left"
android:text="PRICING"
android:textColor="#color/white"
android:textSize="18sp" />
<TextView
android:id="#+id/tv_pricelisthead_np"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="2"
android:gravity="center"
android:text="NORMAL"
android:textColor="#color/white"
android:textSize="18sp" />
<TextView
android:id="#+id/tv_pricelisthead_ep"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="2"
android:gravity="center"
android:text="EXPRESS"
android:textColor="#color/white"
android:textSize="18sp" />
</LinearLayout>
<!--
android:background="#drawable/hf_bg"
<TextView
android:id="#+id/tv_price_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="16dp"
android:text="Price List"/>
-->
<ExpandableListView
android:id="#+id/elv_pricelist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transcriptMode="alwaysScroll" >
</ExpandableListView>
</LinearLayout>
with the above layout i could get a list view.
i want this listview to occupy fixed length. headers should always be shown and scrolling should be there for internal child items not for the whole list.
i have only 3 groups and each group may have around 10-30 child items.
I found this code on SO a while back, i tried searching for this, but couldn't find it. If someone does, please edit my answer and provide link to the original answer. Since ExpandableListView extends ListView you can use this code, but make sure in your adapter that the children are expanded already.
private void justifyListViewHeightBasedOnChildren(ListView listView) {
ListAdapter adapter = listView.getAdapter();
if (adapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams par = listView.getLayoutParams();
par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
listView.setLayoutParams(par);
listView.requestLayout();
}

Listview in Cardview enable scroll

I m create a To Do List. Now i want to show the To Do lists in a RecylerView that contains Cards and the cards displaying a textview (title) and a Listview.
The content from Listview should be the Tasks from the TodoList.
I want to get a fix Listview without scrolling, is this possible ?
Card_Layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
card_view:contentPadding="8dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
card_view:cardBackgroundColor="#color/abc_background_cache_hint_selector_material_light"
android:background="#drawable/big_card"
android:elevation="#dimen/elevation_high">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="#+id/title"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity="center_vertical"
/>
<ListView
android:id="#+id/cardList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:isScrollContainer="false"
>
</ListView>
</LinearLayout>
</android.support.v7.widget.CardView>
RecylerView.xml to show the cardview
<FrameLayout
android:id="#+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="#+id/cardList"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
P.s: Is this way List in List a bad solution ? Was there a better Solution to solve this?
just use this call it after setting the adapter for listview like below
cardlist.setadapter(...);
justifyListViewHeightBasedOnChildren(cardlist);
public void justifyListViewHeightBasedOnChildren(ListView listView) {
ListAdapter adapter = listView.getAdapter();
if (adapter == null) {
return;
}
ViewGroup vg = listView;
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, vg);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams par = listView.getLayoutParams();
par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
listView.setLayoutParams(par);
listView.requestLayout();
}

My ListView does not scroll

I'm trying to make an activity with a static header and a scrollable dynamic list. Here is the Layout:
<GridLayout
android:id="#+id/GridLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="1" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp">
<ListView
android:id="#+id/listex"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
I tried to use the height=0dp & weight=1 solution but the result is that when I add something to the list, it does not show any element.
If I use height= match_parent & weight=1 the elements are shown but is not scrollable
Please help, I tried a lot of combinations gettign no results.
Thanks.
I have been using this list view and it works fine.
Maybe you don't have enough items in you list view, for it to scroll?
<ListView
android:id="#+id/list"
android:layout_width="match_parent"
android:layout_height="290dp"
android:layout_weight="0.50" >
</ListView>
You can try using below codes :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="static header" />
<ListView
android:id="#+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
This is my solution.
<ListView
android:id="#+id/listView"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="fill_horizontal"
android:fadeScrollbars="true"
android:layout_weight="1" />
set ListView weight to 1. or You can do like this.
just after u set ur adapter call this method and set adapternotifydatasetchange() after dat.
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.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, ViewGroup.LayoutParams.WRAP_CONTENT));
view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
your list in the GridLayout remove the parent of list view that is GridLayout it will scroll perfectly.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp">
<ListView
android:id="#+id/listex"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
</LinearLayout>
The vertically scrolling GridLayout should not contain another vertically scrolling widget (ListView).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 that is its ScrollView
Set to the linearLayout weightSum = 1

Categories

Resources