我一直试图在SO和Google上搜索一段时间,但是却无法做到这一点。我有一个与它关联的customadapter的ListView。在这个ListView的布局中,我有另一个ListView(也有自己的customadapter),其中只有0到4个项目。
外部/第一个列表视图中行的高度需要根据内部/嵌套列表视图中的行数进行扩展和收缩,但这不会发生。它只会在留给自己的设备时显示一行。
我几乎随机地使用layout_height:0
和layout_weight:1
分配各种LinearLayouts和ListView,同时改变match_parent
与wrap_content
的值,但无济于事
这是一个简单的修复,我知道,但无法解决布局中哪个元素需要哪些参数。我也不想以编程方式执行此操作。 只需要正确的布局属性组合。
提前致谢。
OUTER ListView的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp">
<TextView
android:id="@+id/tvDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#ffdddd">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ddffdd"
>
<ListView
android:id="@+id/lvInnerListView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#eeeeee">
<TextView
android:id="@+id/tvSomeOtherText"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
INNER / NESTED列表视图的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:background="#ddddff">
<TextView
android:id="@+id/tvText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvText4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvText5"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
片段本身的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Title" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Get Values"
android:id="@+id/btnGetValues"
android:layout_marginTop="24dp"
android:layout_marginBottom="24dp"
android:padding="12dp"
android:textColor="#ffffff"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Response from server"
android:id="@+id/tvResponse"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@+id/lvOuterListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
</LinearLayout>
答案 0 :(得分:3)
与简单调整参数相比,您面临的问题更深层次。请查看此主题:How can I put a ListView into a ScrollView without it collapsing? - 它背后有解释。
首先,也是最重要的,要在可滚动视图内嵌套可滚动视图(ListView
内ListView
,RecyclerView
内RecyclerView
,ScrollView
内{ {1}}等)是a bad practice。
人recommend要做的是动态地向ScrollView
动态添加和删除元素。 自动解决您的问题。即LinearLayout
永远会“扩展”。
以下是如何实现它(我将使用LinearLayout
代替RecyclerView
):
您可以找到此示例的源代码 here ;
在活动中,我正在初始化“外部”ListView
(实际上是唯一的):
XML:
RecyclerView
代码:
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然后我创建了一个RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new CustomAdapter());
:
CustomAdapter
下一步,创建public final class CustomAdapter extends RecyclerView.Adapter {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new CustomViewHolder(new CustomView(parent.getContext()));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((CustomView)holder.itemView).bind(String.format("Position %s", position), position % 4);
}
@Override
public int getItemCount() {
return 42;
}
class CustomViewHolder extends RecyclerView.ViewHolder {
public CustomViewHolder(View itemView) {
super(itemView);
}
}
}
(在我的案例中,将包含曾经是您的内部CustomView
的那个 - 只有一个ListView
)适配器:
XML:
LinearLayout
代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/titleTextView"
android:layout_weight="1"
android:background="#F0F000"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/containerLinearLayout"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</LinearLayout>
将一个条目添加到嵌套public final class CustomView extends FrameLayout {
public CustomView(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.view_item, this);
}
public void bind(String name, int value) {
TextView textView = (TextView)getRootView().findViewById(R.id.titleTextView);
LinearLayout containerLinearLayout = (LinearLayout)getRootView().findViewById(R.id.containerLinearLayout);
textView.setText(name);
containerLinearLayout.removeAllViews();
for (int i = 0; i < value; i++) {
containerLinearLayout.addView(new NestedCustomView(getContext()));
}
}
}
(旧内部LinearLayout
)的最后一步:
XML:
ListView
代码:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:text="I'm a nested View"
android:background="#aa0a0a"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"/>
</merge>
就是这样。同样,这个HelloWorld可用 here 。
我希望,这有帮助。