Метод NavigationDrawer AddFooter в MvxListView — NullReferenceException

В настоящее время я реализую кроссплатформенное приложение для Android и iOS.

Поскольку я хочу использовать MvvmCross и всплывающую навигацию, если будет найдена демонстрация Бенджамина Хизелла (с использованием DrawerLayout), чрезвычайно полезная:

Код: https://github.com/benhysell/V.FlyoutTest

Описание: http://benjaminhysell.com/archive/2014/04/mvvmcross-flyoutnavigation-hamburger-menu-sliding-menu-for-android-and-ios/

Основываясь на этом коде, я хотел добавить некоторые дополнительные элементы управления под меню внутри всплывающей навигации.

Итак, в HomeView я добавил следующий код в конце метода

protected override void OnCreate(Bundle savedInstanceState)
{
    // ....

    var layout = this.BindingInflate(Resource.Layout.DrawerFooterView, null);
    drawerList.AddFooterView(layout);
}

Теперь, когда я запускаю приложение, я все прекрасно вижу, включая дополнительные элементы управления во всплывающем меню. Но как только я нажимаю на пункт меню, я получаю исключение NullReferenceException в MvvmCross:

04-25 17:42:20.892 I/MonoDroid(32443): UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
04-25 17:42:20.892 I/MonoDroid(32443): at Cirrious.MvvmCross.Binding.Droid.Views.MvxListView.ExecuteCommandOnItem (System.Windows.Input.ICommand,int) <IL 0x0000b, 0x000a0>
04-25 17:42:20.892 I/MonoDroid(32443): at Cirrious.MvvmCross.Binding.Droid.Views.MvxListView.<EnsureItemClickOverloaded>b__0 (object,Android.Widget.AdapterView/ItemClickEventArgs) <IL 0x0000d, 0x000a7>
04-25 17:42:20.892 I/MonoDroid(32443): at Android.Widget.AdapterView/IOnItemClickListenerImplementor.OnItemClick (Android.Widget.AdapterView,Android.Views.View,int,long) [0x0000d] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/a1e3982a/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.Widget.AdapterView.cs:261
04-25 17:42:20.892 I/MonoDroid(32443): at (wrapper dynamic-method) object.289e379c-ed35-42d0-8505-cc91a6c90d7b (intptr,intptr,intptr,intptr,int,long) <IL 0x00029, 0x0009b>

Может ли кто-нибудь оказать помощь в этом вопросе, потому что у меня нет идей.

Любая помощь будет оценена по достоинству.


person gridr    schedule 25.04.2014    source источник
comment
Как выглядит ваш макет и модель просмотра?   -  person Kiliman    schedule 26.04.2014
comment
@Kiliman, макет «DrawerFooterView» представляет собой простой LinearLayout с несколькими TextView, «DrawerFooterViewModel» еще пуст, потому что ни один из этих TextView еще не привязан к какому-либо свойству.   -  person gridr    schedule 26.04.2014
comment
Вероятно, ссылка на github.com/MvvmCross/MvvmCross/issues/602   -  person Stuart    schedule 27.04.2014
comment
Привет @Stuart, спасибо за ссылку, похоже, это именно эта проблема. Хотя, кажется, решения для этого пока нет.   -  person gridr    schedule 28.04.2014


Ответы (2)


Я не понимаю, почему добавление представления Header или Footer к представлению ListView имеет такое большое значение.

Конечно, есть некоторые причуды с добавлением их непосредственно в MvxListView, но вы можете сделать эту работу самостоятельно, не прилагая особых усилий.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/header"
        android:orientation="vertical"
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- Header content here -->
    </LinearLayout>

    <LinearLayout
        android:id="@+id/footer"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- Footer content here -->
    </LinearLayout>

    <MvxListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/header"
        android:layout_above="@+id/footer"
        local:MvxBind="ItemsSource Items; ItemSelected SelectedItem"/>
</RelativeLayout>

Затем вы можете добавить EventHandler к событию Scroll, если вы хотите показать/скрыть нижний колонтитул, достигли ли вы дна:

var footer = FindViewById<LinearLayout>(Resource.Id.footer);
var lv = FindViewById<MvxListView>(Resource.Id.listview);
lv.Scroll += (s, e) =>
{
    var lastItem = e.FirstVisibleItem + e.VisibleItemCount;
    if(lastItem == e.TotalItemCount)
    {
        // we are at the end of the list
        // maybe do some animation before showing it
        footer.Visibility = ViewStates.Visible;
    }
    else
    {
        footer.Visibility = ViewStates.Gone;
    }
};
person Cheesebaron    schedule 28.04.2014
comment
Да, это будет работать, но анимация отображения/скрытия будет отличаться от прокрутки списка. - person Eugene Smykov; 29.04.2014
comment
Спасибо @Cheesebaron за ваш ответ. В конце концов, я реализовал что-то похожее на это, но без части видимости. Я просто подумал, что использование нижнего колонтитула списка было бы хорошим и удобным решением. - person gridr; 29.04.2014
comment
В конечном счете, я думаю, эту проблему с MvxAdapter следует как-то решить. Я думаю, что в проблеме #602 уже есть несколько предложенных решений. - person Cheesebaron; 05.05.2014

В настоящее время MvxListView не поддерживает методы AddHeader/AddFooter.

В крайних случаях вы можете добавить пользовательский элемент для просмотра списка навигации: Polymorphic Списки

Таким образом, у вас будет два типа предметов:

1 - строка навигации по умолчанию

2 - футер, в вашем случае

person Eugene Smykov    schedule 28.04.2014