2017-01-09 19 views
0

MvvmCrossでは、動作するアクティビティ内にアンドロイドのリストビューがあります。MvxRecyclerViewを使用してMvvmCrossでRecyclerビューを実装する方法

私は、listViewをrecyclerViewに変更するのは、私のレイアウトの.axmlファイルでMvxListViewをMvxRecyclerViewに変更するのと同じくらい簡単です。それは私に、次の実行時例外を与えるしよう:

Android.Views.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class Mvx.MvxRecyclerView 

私はMvxRecyclerViewを使用したときの背後にあるコードやビューモデルで異なるしなければならないものはありますか?以下は私のコードです。

レイアウトファイル:

Main.axml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <Mvx.MvxRecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" 
     android:id="@+id/words_listview" 
     local:MvxItemTemplate="@layout/words_listview_row" 
     local:MvxBind="ItemsSource Words" /> 
</LinearLayout> 

words_listview_row.axml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:p1="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    p1:minWidth="25px" 
    p1:minHeight="25px" 
    p1:layout_width="match_parent" 
    p1:layout_height="match_parent" 
    p1:id="@+id/relativeLayout1" 
    p1:background="#FFFFFF"> 
    <TextView 
     p1:text="Word name" 
     p1:layout_width="wrap_content" 
     p1:layout_height="wrap_content" 
     p1:id="@+id/headingTextView" 
     p1:width="325dp" 
     p1:textColor="#000000" 
     p1:layout_alignParentLeft="true" 
     p1:textSize="18sp" 
     p1:paddingLeft="20dp" 
     p1:paddingTop="15dp" 
     local:MvxBind="Text Name" /> 
    <TextView 
     p1:text="Word meaning" 
     p1:layout_width="match_parent" 
     p1:layout_height="wrap_content" 
     p1:layout_below="@id/headingTextView" 
     p1:id="@+id/detailTextView" 
     p1:textColor="#8f949a" 
     p1:layout_alignParentLeft="true" 
     p1:textSize="16sp" 
     p1:paddingLeft="20dp" 
     p1:paddingRight="20dp" 
     p1:paddingBottom="15dp" 
     local:MvxBind="Text Meaning" /> 
</RelativeLayout> 

WordViewModel.cs

using MvvmCross.Core.ViewModels; 
using VocabBuilder.Core.Models; 
using VocabBuilder.Core.Services.Interfaces; 

namespace VocabBuilder.Core.ViewModels 
{ 
    public class WordViewModel : MvxViewModel 
    { 
     private IWordService _wordService; 

     public MvxObservableCollection<Word> Words { get; set; } 

     public WordViewModel(IWordService wordService) 
     { 
      Words = new MvxObservableCollection<Word>(); 

      _wordService = wordService; 

      Words.ReplaceWith(_wordService.GetAllWords()); 
     } 
    } 
} 

分離コード/ WordView.cs

using Android.App; 
using Android.OS; 
using MvvmCross.Droid.Views; 
using VocabBuilder.Core.ViewModels; 

namespace VocabBuilder.UI.Droid.Views 
{ 
    [Activity(Label="Vocab Builder", MainLauncher=true)] 
    public class WordView : MvxActivity<WordViewModel> 
    { 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      SetContentView(Resource.Layout.Main); 
     } 
    } 
} 

ありがとうございました。

EDIT:

はここに私のSetup.csファイルです:

using Android.Content; 
using MvvmCross.Core.ViewModels; 
using MvvmCross.Droid.Platform; 

namespace VocabBuilder.UI.Droid 
{ 
    public class Setup : MvxAndroidSetup 
    { 
     public Setup(Context applicationContext) : base(applicationContext) 
     { 
     } 

     protected override IMvxApplication CreateApp() 
     { 
      return new Core.App(); 
     } 
    } 
} 
+0

MvxActivityをMvxAppCompatActivityに置き換えてみてください。 – sJy

+0

Setup.csファイルを表示してください。私はそこにそれを登録していないだろうと思う。 – Cheesebaron

+0

@sJy MvxAppCompatActivityを使用して同じエラーが発生します。 –

答えて

2

OK、私はRecyclerViewがMvxRecyclerViewでMvxListViewを交換した後簡単に動作するようになりました。あなたの実装の特定の問題が何であるか分かりませんが、私はあなたに私のちょっとした情報を与え、あなたはそれをすべて試してみることができます。

私のRecyclerViewは、MvxFragmentから継承したフラグメントに存在します。あなたとは少し異なりますが、決定要因ではありません。ここではいくつかのフラグメントのスニペットは、次のとおりです。ここで

public class ListsFragment : MvxFragment<ListsViewModel> 
{ 
    ... 
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     base.OnCreateView(inflater, container, savedInstanceState); 
     var view = this.BindingInflate(Resource.Layout.fragment_listsfragment, null); 
     return view; 
    } 
    ... 
} 

がfragment_listsfragmentためAXMLです:私はあなたのViewModelの実装の違いのビットを参照しています

<?xml version="1.0" encoding="utf-8"?> 
<MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:MvxItemTemplate="@layout/item_list" 
    app:MvxBind="ItemsSource Lists; ItemClick ShowListItemsCommand" /> 

- 鉱山は、このようなものです:

public class ListsViewModel : BaseViewModel 
{ 
    ... 
    private readonly IListService _listService; 
    private ObservableCollection<Models.List> _lists; 

    public ObservableCollection<Models.List> Lists 
    { 
    get { return _lists; } 
    set 
    { 
     _lists = value; 
     RaisePropertyChanged(() => Lists); 
    } 
    } 

    public MvxCommand<Models.List> ShowListItemsCommand 
    { 
    get 
    { 
     return new MvxCommand<Models.List>(selectedList => 
     { 
     ShowViewModel<ListItemsViewModel> 
       (new { listId = selectedList.Id }); 
     }); 
    } 
    } 
    ... 
    public override async void Start() 
    { 
    base.Start(); 
    await InitializeAsync(); 
    } 

    protected override async Task InitializeAsync() 
    { 
    await _listService.InitializeAsync(); 
    Lists = (await _listService.GetListsAsync()) 
      .ToObservableCollection(); 
    } 
} 

これが役立つことを願っています。

関連する問題