ScrollView 中的列表视图不显示所有项目
Listview in ScrollView not displaying all items
我的布局有两个 ListView,它们都在滚动视图中,因为内容可能会超过设备的高度。这是布局:
<RelativeLayout 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.galleri5.android.activities.ImageActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:elevation="4dp"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#FAC80A">
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Image"
android:textColor="#000000"
android:textSize="17sp"
android:layout_centerVertical="true"
android:id="@+id/textView80" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView134"
android:src="@drawable/gallery_page_ic_notifications"
android:layout_alignParentEnd="true"
android:layout_marginRight="30dp"
android:layout_centerVertical="true" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
<ScrollView
android:id="@+id/scrollView2"
android:layout_below="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/user_profile_bg"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView102"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:layout_marginTop="10dp"
android:adjustViewBounds="true" />
<ImageView
android:id="@+id/imageView103"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<TextView
android:id="@+id/textView38"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:alpha="0.8"
android:inputType="textMultiLine"
android:textColor="#FFFFFF" />
<TextView
android:id="@+id/textView39"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="25dp"
android:layout_marginLeft="30dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#707070" />
<ImageView
android:id="@+id/imageView104"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView107"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingRight="5dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/imageView107"
android:orientation="vertical"
android:paddingLeft="5dp">
<TextView
android:id="@+id/textView45"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.8"
android:paddingBottom="2dp"
android:textColor="#FFFFFF" />
<TextView
android:id="@+id/textView46"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#707070"
android:textSize="12sp" />
</LinearLayout>
<ImageView
android:id="@+id/imageView108"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:src="@drawable/image_page_button_bookmark" />
</RelativeLayout>
</LinearLayout>
<ImageView
android:id="@+id/imageView109"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="10dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="35dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#343031"
android:orientation="vertical">
<TextView
android:id="@+id/textView47"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:layout_marginTop="15dp"
android:text="This Image is Part Of..."
android:textColor="#707070" />
<ImageView
android:id="@+id/imageView110"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp"
android:layout_marginTop="10dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView2" />
<TextView
android:id="@+id/textView57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginLeft="30dp"
android:text="See All Galleries"
android:textColor="#707070" />
</LinearLayout>
</android.support.v7.widget.CardView>
<ImageView
android:id="@+id/imageView125"
android:layout_width="305dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginBottom="20dp"
android:src="@drawable/image_page_belongs_to_shape_line_separator_1" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView6" />
<EditText
android:id="@+id/editText6"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:alpha="0.8"
android:inputType="text"
android:elegantTextHeight="true"
android:enabled="true"
android:hint="Comment"
android:textCursorDrawable="@null"
android:textColor="#FFFFFF"
android:textColorHint="#FFFFFF"
android:layout_marginTop="10dp"
android:backgroundTint="#fac80a" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
两个listview的id分别是listView2和listView6。我已经正确地为这两个列表视图设置了适配器。我正在从后端获取数据。对于这两个列表视图,我从后端获取了两个项目,但实际上它在每个列表视图中只显示了一个项目。我还尝试使用 notifyDataSetChanged() 将项目添加到第二个 listView,但这也不起作用。我只得到一件物品。可能的原因是什么以及如何解决?
不建议在滚动视图中使用列表视图。虽然列表显示了所有项目,但滚动到列表的体验并不好。您应该重新调整您的布局以避免这种情况。
希望对你有帮助!!
这是我所做的,以防其他人遇到类似问题:
注意:这个解决方案效率很低。我正在使用它,因为我的 listView 中最多有 2 个项目。如果您有一个包含大量项目的 listView,我不会向其他人推荐它。
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);
}
我在设置适配器后在两个 listView 上调用了这个函数。
希望对你有帮助。
正如我在评论中所说,而不是在 scrollview 中使用 listview,使用 recyclerview. I just created a demo project 让您了解具有多个布局的 recyclerview。导入项目并查看它。
与您将当前布局裁剪成多个布局并根据您的需要扩充它们并在 recyclerview 中实施它的方式相同。
另一种可能性是使用 一个 ListView 和 2-.. 不同的 适配器 许多 不同的视图。对于 ListViews,有 https://github.com/commonsguy/cwac-merge。在一个大适配器中添加许多适配器和视图,您可以将其添加到 1 个 ListView。
页面文字:
只需创建一个 MergeAdapter 并调用 addAdapter()、addView() 或 addViews()(后者接受一个 List),然后将您的适配器附加到 ListView。
Gradle:
repositories {
maven {
url "https://s3.amazonaws.com/repo.commonsware.com"
}
}
dependencies {
compile 'com.commonsware.cwac:merge:1.1.+'
}
我的布局有两个 ListView,它们都在滚动视图中,因为内容可能会超过设备的高度。这是布局:
<RelativeLayout 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.galleri5.android.activities.ImageActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:elevation="4dp"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#FAC80A">
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Image"
android:textColor="#000000"
android:textSize="17sp"
android:layout_centerVertical="true"
android:id="@+id/textView80" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView134"
android:src="@drawable/gallery_page_ic_notifications"
android:layout_alignParentEnd="true"
android:layout_marginRight="30dp"
android:layout_centerVertical="true" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
<ScrollView
android:id="@+id/scrollView2"
android:layout_below="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/user_profile_bg"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView102"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:layout_marginTop="10dp"
android:adjustViewBounds="true" />
<ImageView
android:id="@+id/imageView103"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<TextView
android:id="@+id/textView38"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:alpha="0.8"
android:inputType="textMultiLine"
android:textColor="#FFFFFF" />
<TextView
android:id="@+id/textView39"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="25dp"
android:layout_marginLeft="30dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#707070" />
<ImageView
android:id="@+id/imageView104"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView107"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingRight="5dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/imageView107"
android:orientation="vertical"
android:paddingLeft="5dp">
<TextView
android:id="@+id/textView45"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.8"
android:paddingBottom="2dp"
android:textColor="#FFFFFF" />
<TextView
android:id="@+id/textView46"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#707070"
android:textSize="12sp" />
</LinearLayout>
<ImageView
android:id="@+id/imageView108"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:src="@drawable/image_page_button_bookmark" />
</RelativeLayout>
</LinearLayout>
<ImageView
android:id="@+id/imageView109"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="10dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="35dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#343031"
android:orientation="vertical">
<TextView
android:id="@+id/textView47"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:layout_marginTop="15dp"
android:text="This Image is Part Of..."
android:textColor="#707070" />
<ImageView
android:id="@+id/imageView110"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp"
android:layout_marginTop="10dp"
android:src="@drawable/user_profile_activity_1_shape_thin_line_separator" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView2" />
<TextView
android:id="@+id/textView57"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginLeft="30dp"
android:text="See All Galleries"
android:textColor="#707070" />
</LinearLayout>
</android.support.v7.widget.CardView>
<ImageView
android:id="@+id/imageView125"
android:layout_width="305dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginBottom="20dp"
android:src="@drawable/image_page_belongs_to_shape_line_separator_1" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView6" />
<EditText
android:id="@+id/editText6"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:alpha="0.8"
android:inputType="text"
android:elegantTextHeight="true"
android:enabled="true"
android:hint="Comment"
android:textCursorDrawable="@null"
android:textColor="#FFFFFF"
android:textColorHint="#FFFFFF"
android:layout_marginTop="10dp"
android:backgroundTint="#fac80a" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
两个listview的id分别是listView2和listView6。我已经正确地为这两个列表视图设置了适配器。我正在从后端获取数据。对于这两个列表视图,我从后端获取了两个项目,但实际上它在每个列表视图中只显示了一个项目。我还尝试使用 notifyDataSetChanged() 将项目添加到第二个 listView,但这也不起作用。我只得到一件物品。可能的原因是什么以及如何解决?
不建议在滚动视图中使用列表视图。虽然列表显示了所有项目,但滚动到列表的体验并不好。您应该重新调整您的布局以避免这种情况。
希望对你有帮助!!
这是我所做的,以防其他人遇到类似问题:
注意:这个解决方案效率很低。我正在使用它,因为我的 listView 中最多有 2 个项目。如果您有一个包含大量项目的 listView,我不会向其他人推荐它。
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);
}
我在设置适配器后在两个 listView 上调用了这个函数。 希望对你有帮助。
正如我在评论中所说,而不是在 scrollview 中使用 listview,使用 recyclerview. I just created a demo project 让您了解具有多个布局的 recyclerview。导入项目并查看它。
与您将当前布局裁剪成多个布局并根据您的需要扩充它们并在 recyclerview 中实施它的方式相同。
另一种可能性是使用 一个 ListView 和 2-.. 不同的 适配器 许多 不同的视图。对于 ListViews,有 https://github.com/commonsguy/cwac-merge。在一个大适配器中添加许多适配器和视图,您可以将其添加到 1 个 ListView。
页面文字:
只需创建一个 MergeAdapter 并调用 addAdapter()、addView() 或 addViews()(后者接受一个 List),然后将您的适配器附加到 ListView。
Gradle:
repositories {
maven {
url "https://s3.amazonaws.com/repo.commonsware.com"
}
}
dependencies {
compile 'com.commonsware.cwac:merge:1.1.+'
}