LayoutParams更改仅在全屏

时间:2016-03-03 10:02:48

标签: c# android xamarin mvvmcross

我正在使用Xamarin和MvvmCross。

我做了一个带有recyclerView的FragmentDialog,列表是通过xml文件上的绑定填充的,所以我没有适配器,我应该保持这种方式。

如果我没有错,那么没有内置的方法来使recyclerView只占用其内容所需的大小,这应该不是问题,但在这种情况下我需要列表从底部开始...

所以我做了这个(它是一个自定义的全屏对话框):

        MvxRecyclerView list = Dialog.FindViewById<MvxRecyclerView>(Resource.Id.recyclerview);
        list.LayoutChange += List_LayoutChange;

然后在layoutChange中

 private void List_LayoutChange(object sender, View.LayoutChangeEventArgs e)
    {
        MvxRecyclerView list = Dialog.FindViewById<MvxRecyclerView>(Resource.Id.recyclerview);

        int itemHeight = list.GetChildAt(0).Height;

        if (itemHeight != 0)
        {
            ViewGroup.LayoutParams prms = list.LayoutParameters;

            prms.Height = itemHeight * list.GetAdapter().ItemCount;

            list.LayoutParameters = prms;
            list.LayoutChange -= List_LayoutChange;
            list.RequestLayout();
        }
    }

工作正常,列表正好得到所需的高度,列表看起来就像是从底部开始。

现在客户告诉我他不喜欢全屏对话框并想要状态栏,我认为这应该很简单,只是在对话框创建时删除这一行?

    dialog.Window.AddFlags(WindowManagerFlags.Fullscreen);

但看起来并不那么容易,当对话框不全屏时,layoutParams的改变似乎没有任何效果,它只是不做任何事情。

正在调用我的方法,我得到正确的物品高度,它只是不改变recyclerview的高度。

请注意,在创建时设置全屏并在recyclerview参数更改后清除标记

所以看起来它只能在全屏模式下工作。

有人可以对此嗤之以鼻吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

正如你所说,RecyclerView并不知道它的大小。 自上次更新到支持lib以来,它就是!

http://android-developers.blogspot.fr/2016/02/android-support-library-232.html

  

RecyclerView小部件为创建列表和网格以及支持动画提供了一个先进而灵活的基础。此版本为LayoutManager API带来了令人兴奋的新功能:自动测量!这允许RecyclerView根据其内容的大小调整自身大小。这意味着现在可以使用以前不可用的方案,例如使用WRAP_CONTENT作为RecyclerView的维度。您会发现所有内置的LayoutManagers现在都支持自动测量。

我建议等待Xamarin包裹的lib(已经有一个测试版https://www.nuget.org/packages/Xamarin.Android.Support.v4/23.2.0-beta1