MvvmCross + Xamarin.Android:如何在ViewPager里面的CardView中设置MvxRecyclerView?

时间:2016-12-08 08:33:00

标签: xamarin.android mvvmcross

我的父活动包含一个托管3个片段的ViewPager。

的MainView:

<CoordinatorLayout>
    <AppBarLayout/>
    <ViewPager/>
</CoordinatorLayout>

在一个片段中,我有一个RecyclerView,它将CardViews显示为项目

子片段:

<CoordinatorLayout>
    <MvxSwipeRefreshLayout>
        <MvxRecyclerView
           local:MvxItemTemplate="@layout/child_item">
    </MvxSwipeRefreshLayout>
</CoordinatorLayout>

在子片段中,我希望每个孩子(一个CardView)拥有自己的RecyclerView,1)水平显示其子项,2)可滚动。但问题是,即使我在XML中设置了layoutManager和方向值,它也不起作用。它垂直显示,不滚动。

Child_item

<CardView>
  <MvxRecyclerView
     local:layoutManager="android.support.v7.widget.LinearLayoutManager"
     android:orientation="horizontal"
     local:MvxItemTemplate="@layout/child_child"
     android:background="@color/Red"/>

</CardView>

Cardview child_child.xml中的子项:

<LinearLayout android:background="@color/Grey">
    <Button>
</LinearLayout>

目前,主ViewPager工作正常;我可以刷卡来改变碎片。子片段还支持垂直滚动;我尝试添加多个cardview以便它必须滚动,我可以做到这一点。在cardview里面,我添加了一个Seekbar来查看子元素是否正在接收触摸输入,这也是有效的。只有卡内的RecyclerView没有接收任何触摸输入,或响应orientation =水平请求。

目前的情况:“XXXXX”按钮垂直堆叠。请注意,有超过2个“XXXX”按钮。卡片视图夹住它但不滚动。 screenshot of current state

我想要实现的目标是什么:按钮应该水平堆叠并且应该可滚动。

1 个答案:

答案 0 :(得分:0)

MvvmCross 4.4.0中的MvxRecyclerView中存在一个错误,它忽略了XML属性并简单地对默认的LinearLayoutManager进行了硬编码。 GitHub issue的进一步发展。

目前,对于这个用例,我将MvxRecyclerView子类硬编码为SetLayoutManager(new LinearLayoutManager(context) { Orientation = Horizontal });并且它可以正常工作。

[Register("bug.droid.components.BugFixRecyclerView")]
public sealed class BugFixRecyclerView : MvxRecyclerView
{
    public BugFixRecyclerView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public BugFixRecyclerView(Context context, IAttributeSet attrs) : this(context, attrs, 0, new MvxRecyclerAdapter())
    {
    }

    public BugFixRecyclerView(Context context, IAttributeSet attrs, int defStyle) : this(context, attrs, defStyle, new MvxRecyclerAdapter())
    {
    }

    public BugFixRecyclerView(Context context, IAttributeSet attrs, int defStyle, IMvxRecyclerAdapter adapter) : base(context, attrs, defStyle, adapter)
    {
        if (adapter == null)
            return;

        var layoutManager = new LinearLayoutManager(context) { Orientation = Horizontal };
        SetLayoutManager(layoutManager);            

        var itemTemplateId = MvxAttributeHelpers.ReadListItemTemplateId(context, attrs);
        var itemTemplateSelector = MvxRecyclerViewAttributeExtensions.BuildItemTemplateSelector(context, attrs);

        adapter.ItemTemplateSelector = itemTemplateSelector;
        Adapter = adapter;

        if (itemTemplateSelector.GetType() == typeof(MvxDefaultTemplateSelector))
            ItemTemplateId = itemTemplateId;
    }
}

并在CardView的RecyclerView中,替换默认的MvxRecyclerView以使用此子类。