0

MvxListViewコレクションにバインドする があります。最初に ViewModel に移動すると、サーバーからデータを読み込み、List を設定します。ビューは素晴らしいロードします。

次に、OnScrollリスナーを に設定しListViewて、ユーザーが一番下までスクロールしたときに次のページをロードできるようにしました。次のようなコマンドを使用して、結果の「次のページ」を取得するコマンドを開始します。

this.ViewModel.ShowNextPageCommand.Execute(null);

Command は最終的に、ViewModel の状態を使用して次のページを取得するメソッドを呼び出します。すべて正常に動作していますが、ListView がバインドされているプロパティを実際に更新しようとすると、次のエラーが発生します -

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an      invocation. ---> Android.Util.AndroidRuntimeException: Exception of type     'Android.Util.AndroidRuntimeException' was thrown.
06-21 14:58:27.969 E/mono    (28485):   at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bs1/0cc7ae3b/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:604 
06-21 14:58:27.969 E/mono    (28485):   at Android.Widget.BaseAdapter.NotifyDataSetChanged () [0x00053] in /Users/builder/data/lanes/monodroid-lion-bs1/0cc7ae3b/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Widget.BaseAdapter.cs:293 

プロパティは次のようになります。

private ICollection<Part> parts;
public ICollection<Part> Parts
{
    get { return parts; }
    set
    {
        this.parts = value;
        RaisePropertyChanged(()=>Parts);

    }
}

プロパティを更新するコードは次のようになります。

private void HandlePartResults(PartsResults results)
{
    if (this.Results == null)
    {
        this.Results = results;
        this.Parts = results.Parts;
    }
    else
    {

        this.Results.Links.Clear();
        this.Results.Links.AddRange(results.Links);
        foreach (var part in results.Parts)
        {
            this.Results.Parts.Add(part);
        }
       Mvx.Trace(MvxTraceLevel.Diagnostic,Results.Parts.Count.ToString());
        this.Parts = Results.Parts;
    }
    this.IsLoading = false;
}

私のレイアウトは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/com.x3wire.mobile.android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
    <ProgressBar
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        local:MvxBind="Visibility IsLoading,Converter=Visibility" />
    <Mvx.MvxListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:id="@+id/PartResultsList"
        local:MvxItemTemplate="@layout/partslistitem"
        local:MvxBind="ItemsSource Parts; ItemClick ShowDetailCommand" />
</FrameLayout>

監視可能なコレクションも使用しようとしましたが、同じ例外が発生します。ここで私が間違っていることは明らかですか?

4

1 に答える 1

0

問題が何であるかを突き止めました(MVVMcrossの問題ではありませんでした)。デバッガーを修正したところ、スレッドの問題がいくつかあることが明らかになりました (そして、OnScroll リスナーが必要以上に起動されていたことがわかりました)。

簡単に言えば、コレクションがビューにバインドされているときに同時にコレクションを変更しようとする複数のスレッドがないことを確認し、console.writes を介してそのような問題をデバッグしようとしないことを確認してください:D

于 2013-06-24T18:05:16.457 に答える