3

我有一个水平的项目列表,我希望平等地共享可用的屏幕宽度。

以前我使用索引绑定到每个项目和一个静态线性布局,每个项目都具有相同的 layout_weight。

当我用 Mvx.MvxLinearLayout 和 ItemsSource 绑定替换静态 LinearLayout 并将项目的标记移动到 Itemtemplate 时,MvxLinearLayout 不再尊重 layout_weight。

我尝试了各种重组项目模板的方法,似乎没有办法让这个控件在排列它的项目时服从 layout_weight。

有没有办法让 Mvx.MvxLinearLayout 尊重 android:layout_weight,或者任何替代方法可以给我一个动态的项目列表,这些项目将在固定尺寸边界的情况下平均排列?

编辑

假设一个包含 3 个项目的列表,具有字符串属性“名称”。

此标记按预期工作,提供 3 个等宽的文本项:

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        local:MvxBind="Text Items[0].Name"
        />
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        local:MvxBind="Text Items[1].Name"
        />
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        local:MvxBind="Text Items[2].Name"
        />
</LinearLayout>

此方法不起作用,布局权重未正确应用于 TextViews:

<Mvx.MvxLinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxBind="ItemsSource Items"
    local:MvxItemTemplate="@layout/item_template" />

ItemTemplate 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    local:MvxBind="Text Name" />
4

2 回答 2

3

问题是,当使用带有 ItemTemplate 的 MvxLinearLayout 时,mvvmcross 会插入一个额外的视图。因此,不要获得视图层次结构:

MvxLinearLayout -> 文本视图

你最终得到:

MvxLinearLayout -> MvxListItemView -> TextView。

因此,应用于 TextView 的布局属性,尤其是权重,对 LinearLayout 是不可见的。MvxListItemView 使用默认布局属性(包装内容)进行初始化,并且看不到重量效果。

动作发生的位置在 MvxViewGroupExtensions 中(例如 Refill),子视图被添加到 LinearLayout 中,而 MvxAdapter 中的 CreateBindableView 方法中,子视图被打包在一个 IMvxListItemView 中。

解决此问题的一种方法是覆盖 MvxViewGroupExtensions 中的方法,并在添加视图后更新 MvxListItemViews 的布局属性(例如从底层视图复制它们)。例如:

private static void Refill(this ViewGroup viewGroup, IAdapter adapter) {
    .... // rest of code
    Invalidate();
    for (int j = 0; j < viewGroup.ChildCount; j++)
    {
        var child = GetChildAt(j) as MvxListItemView;
        var param = new LinearLayout.LayoutParams(
                     0, ViewGroup.LayoutParams.WrapContent, 1.0f);
        child.LayoutParameters = param;
    }
}
于 2014-09-02T09:10:00.957 回答
0

任何获得MvxLinearLayout尊重的方式android:layout_weight

我不知道 - 但听起来你处于调试和实验的完美位置。

要调试布局问题,一个非常有用的工具是层次结构查看器 - http://developer.android.com/tools/debugging/debugging-ui.html - 在这两种布局上使用它可能会告诉你它们实际上的区别是什么在设备上运行。

MvxLinearLayout只是一个LinearLayout- 它继承自它并简单地添加一个数据绑定Adapter以允许您动态添加/删除子项 - 请参阅MvxLinearLayout.cs。

基于此,一个假设是它LinearLayout本身可能不支持layout_weight这种充满活力的孩子。要对此进行调查:

任何替代方法可以给我一个动态的项目列表,这些项目将在固定尺寸边界的情况下均匀排列?

如果内置布局不适合您,那么创建自己的自定义布局非常简单 - 例如,请参阅http://arpitonline.com/blog/2012/07/01/creating-custom-layouts-for -android/ - 完成后,添加绑定就像从MvxLinearLayout.csViewGroup复制和粘贴绑定代码一样简单。

于 2013-08-30T13:00:34.037 回答