有没有办法让Mvx.MvxLinearLayout尊重android:layout\u weight?

有没有办法让Mvx.MvxLinearLayout尊重android:layout\u weight?,android,xamarin.android,mvvmcross,Android,Xamarin.android,Mvvmcross,我有一个水平列表的项目,我希望分享可用的屏幕宽度平等 以前我对每个项目使用了索引绑定和静态线性布局,每个项目都具有相同的布局权重 当我用Mvx.MvxLinearLayout和ItemsSource绑定替换静态线性布局,并将项目的标记移动到Itemtemplate中时,MvxLinearLayout不再考虑布局权重 我尝试了各种方法来重新构造项目模板,但似乎没有办法让该控件在安排项目时遵守布局权重 有没有什么方法可以让Mvx.MvxLinearLayout尊重android:layout\u w

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

以前我对每个项目使用了索引绑定和静态线性布局,每个项目都具有相同的布局权重

当我用Mvx.MvxLinearLayout和ItemsSource绑定替换静态线性布局,并将项目的标记移动到Itemtemplate中时,MvxLinearLayout不再考虑布局权重

我尝试了各种方法来重新构造项目模板,但似乎没有办法让该控件在安排项目时遵守布局权重

有没有什么方法可以让Mvx.MvxLinearLayout尊重android:layout\u weight,或者有没有其他方法可以给我一个动态的项目列表,在给定固定尺寸的边界时,这些项目可以平均排列

编辑

假设一个包含3项的列表,带有字符串属性“Name”

此标记按预期工作,提供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>

此方法不起作用,布局权重未正确应用于文本视图:

<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" />

任何获得MvxLinearLayout的方法都要尊重android:layout\u weight

据我所知,没有一个是这样的——但听起来您正处于调试和实验的完美位置

为了调试布局问题,一个非常有用的工具是层次结构查看器——在两个布局上使用它可以向您显示它们在设备上实际运行时的区别

MvxLinearLayout
只是一个
LinearLayout
-它继承自它,并简单地添加一个数据绑定的
适配器
,允许您动态添加/删除子项-请参阅

基于此,一个假设是,
LinearLayout
本身可能不支持这种动态子项的
layou-weight
。要对此进行调查:

  • 您可以尝试在不使用Mvx的情况下创建UI原型-添加/删除子级时,纯线性布局是否“尊重布局重量”?如果答案是肯定的,那么您的原型和原型之间的区别是什么。如果答案是否定的,那么您就知道问题出在
    LinearLayout
    的某个地方
  • 您可以尝试查看LinearLayout源-例如-此调查可能会发现一些前进的方向-例如,它可能会找到一些方法,您可以强制LinearLayout重新测量,然后您可以从
    ChildViewAdded
    ChildViewRemoved
    事件调用该“force remeasure”方法
有没有其他方法可以给我一个动态的项目列表,在给定一个固定维度的边界时,这些项目可以平均排列


如果内置布局不适合您,那么创建您自己的自定义布局是非常简单的-例如,请参见-一旦您完成了这项工作,那么添加绑定就像从中复制和粘贴
视图组
绑定代码一样简单问题是,mvvmcross在将MvxLinearLayout与ItemTemplate一起使用时插入附加视图。因此,不要获取视图层次结构:

MvxLinearLayout->TextView

你最终会得到:

MvxLinearLayout->MvxListItemView->TextView

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

操作发生的位置在MvxViewGroupExtensions(例如,重新填充)中,子视图添加到LinearLayout中,而在MVXAAdapter中的CreateBindableView方法中,子视图打包在IMvxListItemView中

解决此问题的一种方法是重写MvxViewGroupExtensions中的方法,并在添加视图后更新MVXListItemView的布局属性(例如,从基础视图复制它们)。例如:

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;
    }
}
private static void reflection(此视图组视图组,IAdapter适配器){
..//代码的其余部分
使无效();
对于(int j=0;j
请包含一些以前有效的代码和您尝试过的代码。另外,层次结构查看器显示了什么不同?我已经添加了请求的信息,有人可以帮忙吗?有解决此问题的方法吗?我现在也面临同样的问题。有一个MvxLinearLayout,它不考虑其中项目的布局重量。是否可以获取线性布局项目的单击事件,以便对单击的项目进行操作(如删除它)?