ScrollView 和设置布局的问题
Issues with ScrollView and setting layouts
我是 android 开发的新手。不明白的地方请不要介意。
我对这个问题做了足够的研究,在将其标记为重复之前,请更新解决方案。
我在这里添加了一张图片,其中包含我想要在此处实现的布局安排。
此处 listView
仅显示为 1 项。如果我滚动,所有项目都将滚动到此高度。
我的xml
结构是
<LinearLayout>(parent)
<ScrollView>
<LinearLayout>
<LinearLayout>
weight: __
-----------
</LinearLayout>
<ListView>
h:match_parent
w:wrap_content
weight:__
</ListView>
<LinearLayout>
weight:__
--------------
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
我正在从数据库中获取大量数据集,并且必须在两者的中间显示这些数据集 LinearLayouts
。现在我正在使用 ListView
但似乎不可能像我期望的那样在这里使用。
请建议我是否可以在此处执行 ListView
或如何为每个数据集使用 LinearLayout
块的数量?
更新
这就是我所期望的,如图所示。
可能需要进一步说明您要完成的具体目标。
如果 ListView
应该更长并且滚动浏览列表中的更多项目,我可能建议使用 RecyclerView
。它的设置有点多,但允许根据概念创建更复杂的布局。
如果您想进一步搜索,有很多很好的参考资料可以学习 RecyclerView
的方法:
- 这个可能会帮助您设置问题的解决方案
- How to create RecyclerView with multiple view type?
- Android
RecyclerView
的开发者网站教程
来自 Code Path 的 - Post 帮助我将所有内容补充在一起。
试试这个方法
<LinearLayout>
<LinearLayout>
<LinearLayout>
weight: __
-----------
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView>
h:match_parent
w:wrap_content
weight:__
</ListView>
</ScrollView>
<LinearLayout>
weight:__
--------------
</LinearLayout>
</LinearLayout>
试试这个
<LinearLayout>(parent)
<NestedScrollView>
<LinearLayout>
<LinearLayout>
w:wrap_content
h:wrap_content
</LinearLayout>
<ListView>
w:match_p__arent
h:match_p__arent
weight:1
NestedScroll:true
</ListView>
<LinearLayout>
w:match_p__arent
h:match_p__arent
weight:1
</LinearLayout>
</LinearLayout>
</NestedScrollView>
</LinearLayout>
我已经在我的 Android 工作室中尝试过了,我的工作正常,我可以滚动视图。我的比你的稍微差一点。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent">
<LinearLayout
android:id="@+id/first"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorAccent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:text="@string/hello" />
</LinearLayout>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@color/black_overlay"
android:layout_below="@+id/first" />
<LinearLayout
android:id="@+id/second"
android:layout_width="match_parent"
android:layout_height="550dp"
android:background="@color/colorAccent"
android:layout_below="@+id/listview"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:text="@string/hello" />
</LinearLayout>
</RelativeLayout>
</ScrollView>
您的 ListView 需要此方法
public static void setListViewHeightBasedOnItems(ListView target_Listview, int limit) // LIMIT 0 FOR SHOWING ALLL CONTENTS
{
if (limit == 0) {
ListAdapter listAdapter = target_Listview.getAdapter();
if (listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all items.
int totalItemsHeight = 0;
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
// if(itemPos < 4)
// {
View item = listAdapter.getView(itemPos, null, target_Listview);
item.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
Log.e("" + itemPos, "" + item.getMeasuredHeight());
totalItemsHeight += item.getMeasuredHeight();
// }
}
// Get total height of all item dividers.
int totalDividersHeight = target_Listview.getDividerHeight() * (numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = target_Listview.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight;
target_Listview.setLayoutParams(params);
target_Listview.requestLayout();
// return true;
}
else {
}
}
else {
ListAdapter listAdapter = target_Listview.getAdapter();
if (listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all items.
int totalItemsHeight = 0;
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
if (itemPos < limit) {
View item = listAdapter.getView(itemPos, null, target_Listview);
item.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
Log.e("" + itemPos, "" + item.getMeasuredHeight());
totalItemsHeight += item.getMeasuredHeight();
}
}
// Get total height of all item dividers.
int totalDividersHeight = target_Listview.getDividerHeight() * (numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = target_Listview.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight;
target_Listview.setLayoutParams(params);
target_Listview.requestLayout();
}
}
}
在 ListView
上设置适配器后,只需调用该方法并在参数中传递 ListView
,并将列表大小作为第二个参数。
One Suggestion from my side
:您应该使用 RecyclerView
而不是 listview
。设置完所有内容(适配器等)后只需要为此写一行
recyclerView.HasFixedSize();
希望我的回答对您有所帮助。
我是 android 开发的新手。不明白的地方请不要介意。
我对这个问题做了足够的研究,在将其标记为重复之前,请更新解决方案。
我在这里添加了一张图片,其中包含我想要在此处实现的布局安排。
此处 listView
仅显示为 1 项。如果我滚动,所有项目都将滚动到此高度。
我的xml
结构是
<LinearLayout>(parent)
<ScrollView>
<LinearLayout>
<LinearLayout>
weight: __
-----------
</LinearLayout>
<ListView>
h:match_parent
w:wrap_content
weight:__
</ListView>
<LinearLayout>
weight:__
--------------
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
我正在从数据库中获取大量数据集,并且必须在两者的中间显示这些数据集 LinearLayouts
。现在我正在使用 ListView
但似乎不可能像我期望的那样在这里使用。
请建议我是否可以在此处执行 ListView
或如何为每个数据集使用 LinearLayout
块的数量?
更新 这就是我所期望的,如图所示。
可能需要进一步说明您要完成的具体目标。
如果 ListView
应该更长并且滚动浏览列表中的更多项目,我可能建议使用 RecyclerView
。它的设置有点多,但允许根据概念创建更复杂的布局。
如果您想进一步搜索,有很多很好的参考资料可以学习 RecyclerView
的方法:
- 这个可能会帮助您设置问题的解决方案
- How to create RecyclerView with multiple view type?
- Android
RecyclerView
的开发者网站教程
来自 Code Path 的 - Post 帮助我将所有内容补充在一起。
试试这个方法
<LinearLayout>
<LinearLayout>
<LinearLayout>
weight: __
-----------
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView>
h:match_parent
w:wrap_content
weight:__
</ListView>
</ScrollView>
<LinearLayout>
weight:__
--------------
</LinearLayout>
</LinearLayout>
试试这个
<LinearLayout>(parent)
<NestedScrollView>
<LinearLayout>
<LinearLayout>
w:wrap_content
h:wrap_content
</LinearLayout>
<ListView>
w:match_p__arent
h:match_p__arent
weight:1
NestedScroll:true
</ListView>
<LinearLayout>
w:match_p__arent
h:match_p__arent
weight:1
</LinearLayout>
</LinearLayout>
</NestedScrollView>
</LinearLayout>
我已经在我的 Android 工作室中尝试过了,我的工作正常,我可以滚动视图。我的比你的稍微差一点。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent">
<LinearLayout
android:id="@+id/first"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorAccent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:text="@string/hello" />
</LinearLayout>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@color/black_overlay"
android:layout_below="@+id/first" />
<LinearLayout
android:id="@+id/second"
android:layout_width="match_parent"
android:layout_height="550dp"
android:background="@color/colorAccent"
android:layout_below="@+id/listview"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:text="@string/hello" />
</LinearLayout>
</RelativeLayout>
</ScrollView>
您的 ListView 需要此方法
public static void setListViewHeightBasedOnItems(ListView target_Listview, int limit) // LIMIT 0 FOR SHOWING ALLL CONTENTS
{
if (limit == 0) {
ListAdapter listAdapter = target_Listview.getAdapter();
if (listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all items.
int totalItemsHeight = 0;
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
// if(itemPos < 4)
// {
View item = listAdapter.getView(itemPos, null, target_Listview);
item.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
Log.e("" + itemPos, "" + item.getMeasuredHeight());
totalItemsHeight += item.getMeasuredHeight();
// }
}
// Get total height of all item dividers.
int totalDividersHeight = target_Listview.getDividerHeight() * (numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = target_Listview.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight;
target_Listview.setLayoutParams(params);
target_Listview.requestLayout();
// return true;
}
else {
}
}
else {
ListAdapter listAdapter = target_Listview.getAdapter();
if (listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all items.
int totalItemsHeight = 0;
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
if (itemPos < limit) {
View item = listAdapter.getView(itemPos, null, target_Listview);
item.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
Log.e("" + itemPos, "" + item.getMeasuredHeight());
totalItemsHeight += item.getMeasuredHeight();
}
}
// Get total height of all item dividers.
int totalDividersHeight = target_Listview.getDividerHeight() * (numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = target_Listview.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight;
target_Listview.setLayoutParams(params);
target_Listview.requestLayout();
}
}
}
在 ListView
上设置适配器后,只需调用该方法并在参数中传递 ListView
,并将列表大小作为第二个参数。
One Suggestion from my side
:您应该使用 RecyclerView
而不是 listview
。设置完所有内容(适配器等)后只需要为此写一行
recyclerView.HasFixedSize();
希望我的回答对您有所帮助。