We shouldn’t use ListView
inside the ScrollView because the list view is already ScrollView, the items in
list view are already scrollable..
Problem
/ Issue
When we try to add the
ListView into the ScrollView, we may face a problem that the list view will show only one item from
the adapter.
To solve this issue,
we should know the definition of ScrollView.
As per the Android
Documentaion:
A ScrollView is a
FrameLayout, meaning you should place one child in it containing the entire
contents to scroll; this child may itself be a layout manager with a complex
hierarchy of objects. A child that is often used is a LinearLayout in a
vertical orientation, presenting a vertical array of top-level items that the
user can scroll through.
You
should never use a ScrollView with a ListView, because
ListView takes care of its own vertical scrolling. Most importantly, doing this
defeats all of the important optimizations in ListView for dealing with large
lists, since it effectively forces the ListView to display its entire list of
items to fill up the infinite container supplied by ScrollView.
Solution
Calculate the size of the list items
and set the height of the ListView programmatically.
Call setListViewHeightBasedOnChildren(listview) method right after the listView.setAdapter.
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);
listView.requestLayout();
}
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);
listView.requestLayout();
}
Origin: setListViewHeightBasedOnChildren
& how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing
Thanks for reading :)
Whether this post is helpful?
Have something to add to this post? If you have any other quick thoughts/hints that you think people will find useful? Share it in the comments.