2016-07-27 10 views
0

Hy, Ich möchte die resultilt von SQLite.net Abfrage mit meinem RecyclerView in meiner Xamarin.Android App anzeigen. Wenn die Abfrage synchron abläuft, funktioniert alles gut. aber wenn ich es async übergebe, wird der Recyclerview nicht angezeigt. Ich habe das Ergebnis der Abfrage überprüft und es enthält alle erwarteten Einträge. Dies funktioniert:Anzeige RecyclerView nach ToListAsync()

songsEntryArray = MusicShareDatabase.Instance.Database.Table<SongsEntry>().ToArray(); 

mRecyclerView = rootView.FindViewById<RecyclerView>(Resource.Id.allsongs_recyclerview); 
mLayoutManager = new LinearLayoutManager(this.Activity); 
mRecyclerView.SetLayoutManager(mLayoutManager); 
mAdapter = new AllSongsAdapter(songsEntryArray); 
mAdapter.ItemClick += OnItemClick; 
mRecyclerView.SetAdapter(mAdapter); 
mAdapter.NotifyDataSetChanged(); 

Und das funktioniert nicht:

var query = MusicShareDatabase.Instance.DatabaseAsync.Table<SongsEntry>(); 

query.ToListAsync().ContinueWith(t => 
{ 
    mRecyclerView = rootView.FindViewById<RecyclerView>(Resource.Id.allsongs_recyclerview); 
    mLayoutManager = new LinearLayoutManager(this.Activity); 
    mRecyclerView.SetLayoutManager(mLayoutManager); 
    mAdapter = new AllSongsAdapter(t.Result.ToArray()); 
    mAdapter.ItemClick += OnItemClick; 
    mRecyclerView.SetAdapter(mAdapter); 
    mAdapter.NotifyDataSetChanged(); 
}); 

Antwort

1

Ich denke, dass ContinueWith(Action action) auf dem Hintergrund-Thread ausgeführt wird.

Sie müssen diesen Code auf der UIThread mit Methode Activity.RunOnUiThread(Action action); ausführen.

-Code

query.ToListAsync().ContinueWith(t => 
{ 
    Activity.RunOnUiThread(() => { 
     mRecyclerView = rootView.FindViewById<RecyclerView>(Resource.Id.allsongs_recyclerview); 
     mLayoutManager = new LinearLayoutManager(this.Activity); 
     mRecyclerView.SetLayoutManager(mLayoutManager); 
     mAdapter = new AllSongsAdapter(t.Result.ToArray()); 
     mAdapter.ItemClick += OnItemClick; 
     mRecyclerView.SetAdapter(mAdapter); 
     mAdapter.NotifyDataSetChanged(); 
    }); 
});