LayoutParams 更改仅在全屏时生效
LayoutParams change only takes effect in fullscreen
我正在使用 Xamarin 和 MvvmCross。
我做了一个 FragmentDialog,里面有一个 recyclerView,列表是通过 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 参数更改后清除标志有效
所以看起来它只能在全屏模式下工作。
有人可以解释一下吗?
提前致谢。
正如您所说,RecyclerView 并不知道它的大小。
自上次更新支持库以来,它是 !
http://android-developers.blogspot.fr/2016/02/android-support-library-232.html
The RecyclerView widget provides an advanced and flexible base for creating lists and grids as well as supporting animations. This release brings an exciting new feature to the LayoutManager API: auto-measurement! This allows a RecyclerView to size itself based on the size of its contents. This means that previously unavailable scenarios, such as using WRAP_CONTENT for a dimension of the RecyclerView, are now possible. You’ll find all built in LayoutManagers now support auto-measurement.
我建议等待 Xamarin 包装库(已经有测试版 https://www.nuget.org/packages/Xamarin.Android.Support.v4/23.2.0-beta1)
我正在使用 Xamarin 和 MvvmCross。
我做了一个 FragmentDialog,里面有一个 recyclerView,列表是通过 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 参数更改后清除标志有效
所以看起来它只能在全屏模式下工作。
有人可以解释一下吗?
提前致谢。
正如您所说,RecyclerView 并不知道它的大小。 自上次更新支持库以来,它是 !
http://android-developers.blogspot.fr/2016/02/android-support-library-232.html
The RecyclerView widget provides an advanced and flexible base for creating lists and grids as well as supporting animations. This release brings an exciting new feature to the LayoutManager API: auto-measurement! This allows a RecyclerView to size itself based on the size of its contents. This means that previously unavailable scenarios, such as using WRAP_CONTENT for a dimension of the RecyclerView, are now possible. You’ll find all built in LayoutManagers now support auto-measurement.
我建议等待 Xamarin 包装库(已经有测试版 https://www.nuget.org/packages/Xamarin.Android.Support.v4/23.2.0-beta1)