如何解决Xamarin Android中StackView控件的子项重叠显示问题
Xamarin Android StackView子项重叠问题解决方法
StackView控件原生设计就是用来实现子项层叠堆叠的展示效果,默认自带子项偏移堆叠逻辑,如果你需要子项无重叠依次排列,优先选择更适配的控件,也可以调整StackView参数实现需求。
方案1:替换为更适配的控件(推荐)
如果不需要堆叠效果,直接把StackView替换为垂直方向的LinearLayout,或者用垂直列表的RecyclerView/ListView,从根源上避免堆叠逻辑带来的重叠问题。
替换后的布局示例:
<LinearLayout android:id="@+id/llMaterials" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:divider="@android:color/darker_gray" android:showDividers="middle" android:dividerPadding="8dp"> </LinearLayout>
如果用LinearLayout动态加载子项,只需要遍历物料列表,逐个把Adapter里的子项View添加到LinearLayout中即可。
方案2:保留StackView使用,调整参数避免重叠
- 首先修改StackView布局属性,调整子项偏移规则:
<StackView android:id="@+id/stackViewMaterials" android:layout_width="match_parent" android:layout_height="wrap_content" android:loopViews="false" android:stackFromBottom="false" android:animateLayoutChanges="true" android:padding="8dp"> </StackView>
- 检查自定义
MaterialAdapter的子项布局:- 子项布局高度必须设为
wrap_content或者固定高度,禁止使用match_parent - 子项根布局不要设置负margin,避免主动造成重叠
- 子项布局高度必须设为
- 代码中动态调整子项间距,在绑定Adapter后添加如下逻辑:
StackView stackMaterials = v.FindViewById<StackView>(Resource.Id.stackViewMaterials); stackMaterials.Adapter = new MaterialAdapter(v.Context, work.Materials); // 单个子项高度,根据实际布局调整,设置值略大于子项实际高度即可实现无重叠 int itemHeight = 120; stackMaterials.ChildViewAdded += (s, e) => { e.Child.Top = e.Child.Index * itemHeight; e.Child.RequestLayout(); }; stackMaterials.ItemClick += OnListClick;
内容的提问来源于stack exchange,提问作者luigivampa
相关产品推荐
相关产品推荐

