Я знаю, что это не лучшая практика поместить два ListViews в ScrollView. Тем не менее, это лучшее решение, которое я могу придумать для своей проблемы:Два ListViews в ScrollView
Я хочу, чтобы два списка (первый из 1-5 элементов и последний с максимум 20 элементами) под друг другом в прокручиваемом вид, каждый с собственным заголовком. ListViews не должны сами прокручиваться, они должны просто менять высоту, чтобы обернуть их содержимое. Прокручиваемая часть будет обрабатываться ScrollView.
Поскольку ListView не поддерживает это изначально я использую следующий код:
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
Log.d("DEBUG", "TotalHeight:" + totalHeight);
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listAdapter.getCount() * listView.getDividerHeight());
listView.setLayoutParams(params);
listView.requestLayout();
}
Однако, это делает ListViews примерно в 10 раз больше, то они должны быть. Если я ищу проблему, которую у меня есть, я всегда нахожу решение выше, но для меня это, похоже, не работает.
Есть ли способ исправить мой код или есть лучший способ пойти на это?
XML:
<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.miscoriadev.svvirgoapp.fragments.frag_activiteiten"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_acti_komende_activiteiten"
android:textSize="32sp"
android:text="Komende activiteiten"
android:textColor="@color/TextColorDark"
android:gravity="center"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_acti_komende_activiteiten"
android:id="@+id/lv_komende_activiteiten">
</ListView>
<TextView
android:paddingTop="@dimen/activity_vertical_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="32sp"
android:text="Afgelopen activiteiten"
android:textColor="@color/TextColorDark"
android:gravity="center"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:id="@+id/tv_acti_afgelopen_activiteiten"
android:layout_below="@id/lv_komende_activiteiten"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_acti_afgelopen_activiteiten"
android:id="@+id/lv_afgelopen_activiteiten">
</ListView>
</RelativeLayout>
Вам нужны оба списка для прокрутки в одно и то же время и их отображение на одном экране? Если это так, я бы рекомендовал использовать [GridView] (https://developer.android.com/guide/topics/ui/layout/gridview.html) с двумя столбцами. Если нет, я бы рекомендовал использовать [ViewPager] (https://developer.android.com/training/animation/screen-slide.html) с помощью [TabLayout] (https://developer.android.com/reference/android /support/design/widget/TabLayout.html). Вот учебник о том, как это сделать: https://guides.codepath.com/android/google-play-style-tabs-using-tablayout – klauskpm
Нет, я просто хочу, чтобы они были под друг другом и имели два списка в один прокручиваемый кадр –
Я считаю, что было бы удобнее использовать горизонтальные 'ListView' вместо вертикальных. Я даже рекомендую использовать [RecyclerView] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html), который может быть горизонтальным или вертикальным. – MohanadMohie