我想要制作一个像这样的布局:
问题是,我不想让 ListViews
可滚动。我希望它们的高度尽可能高,并使整个屏幕可滚动。 如果我将 ListView
的高度设置为wrap_content
,那行不通。唯一可行的方法是设置一个具体的高度-但我不知道有多少个项目在 ListView
中。
我知道不应该将 ListView
放在 ScrollView
中- 但我不想让 ListView
可滚动,只需显示所有项。
也许有更好的方法可以解决这个问题?
我想要制作一个像这样的布局:
问题是,我不想让 ListViews
可滚动。我希望它们的高度尽可能高,并使整个屏幕可滚动。 如果我将 ListView
的高度设置为wrap_content
,那行不通。唯一可行的方法是设置一个具体的高度-但我不知道有多少个项目在 ListView
中。
我知道不应该将 ListView
放在 ScrollView
中- 但我不想让 ListView
可滚动,只需显示所有项。
也许有更好的方法可以解决这个问题?
您可以创建一个不可滚动的自定义ListView
public class NonScrollListView extends ListView {
public NonScrollListView(Context context) {
super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public 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();
}
}
在您的布局资源文件中
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdgeLength="0dp"
android:fillViewport="true"
android:overScrollMode="never"
android:scrollbars="none" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- com.Example Changed with your Package name -->
<com.Example.NonScrollListView
android:id="@+id/lv_nonscroll_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.Example.NonScrollListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/lv_nonscroll_list" >
<!-- Your another layout in scroll view -->
</RelativeLayout>
</RelativeLayout>
</ScrollView>
在Java文件中
创建一个自定义ListView对象,而不是普通的ListView。例如:
NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list);
完全不需要使用 listview
。
如果你认真考虑一下,一个 listview
可以在你的情况下被一个 LinearLayout
替换。适配器Adapter
将是相同的,但是,不要将适配器与listview
相关联,而是在数据上使用for循环调用适配器的getView
函数,并将检索到的视图添加到你的垂直 linearlayout
中。
然而,只有在你的列表中有少量项目且这些项目的显示表示形式不会消耗太多内存时才建议使用此方法。
AbsListView.CHOICE_MODE_MULTIPLE_MODAL
的优点时,LinearLayout
并不是ListView
的一个公平替代品。为了避免重复造轮子,请查看NonScrollListView
解决方案。 - rymo2017年最好的方法是使用带有NestedScrollView
的RecyclerView
。
不需要任何技巧,它可以像您想要的那样开箱即用。
final LinearLayout parent=(LinearLayout)findViewById(R.id.parent);
final ListView listview=(ListView)findViewById(R.id.listview);
parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp )));
//number_of_item_in_list is list side ~ listArray.size();
//per_item_size_in_dp = calculate item size in dp. Ex: 80dp
public static int dpToPx(int dp)
{
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
就这些了 :)
嗨,有位名叫Mark Murphy的酷Android开发者,也被称为CommonsWare。他构建了一个非常有用的组件CWAC Merge Adapter,可以让你做你需要的事情。你需要动态添加视图,而不是从XML中添加;但考虑到你简单的UI,这应该不是问题。我在这种情况下使用它,当我不知道应该滚动哪种数据时。
如果你不想使用它(可能是出于许可证原因),你可以在那里放置一个单一的列表视图(而不是两个连续的列表视图),并重写getItemViewsCount
,getItemViewType
和getView
以提供上述布局。如果你在Google上搜索android listview different rows
,你会找到有用的信息。例如this link或this one。
然而,我会选择合并适配器。
(ListView)
,仍然可以正常工作。 - rymoNonScrollListView
的布局时,父级ScrollView
滚动到NonScrollListView
的顶部,而不是滚动到ScrollView
的顶部。(用户必须向上滚动才能查看在NonScrollListView
之前的ScrollView
内容。)这种情况发生在EXACTLY
和AT_MOST
测量模式下,并且对于传递给makeMeasureSpec()
的任何整数高度都是如此。 - kdbanman