2017-09-30 11 views
0

私はXamarin Androidプロジェクトを行っています.SQLiteデータベースからRecyclerViewにオブジェクトのリストを表示することはできません。Xamarin Android asyncは、メソッドを待たずに

RecyclerViewはフラグメント内にあります。私はこのフラグメントを開いたときにリストを表示することを望んでいませんでした。アクティビティからこのフラグメントに戻るとき、私はリサイクラビューのデータを更新しませんでした。

私は正しい値を得ていますが、なぜGetMyObjectsAsyncの結果が待たれていないのか分かりませんなぜですか?

using System.Collections.Generic; 
using System.Threading.Tasks; 
using Android.OS; 
using Android.Support.V7.Widget; 
using Android.Views; 
using Microsoft.Practices.ServiceLocation; 
using System.Linq; 
using Android.App; 
using Android.Widget; 
using Android.Util; 
using System; 

namespace POCProject.Droid.Fragments 
{ 
    public class MyCustomFragment : Fragment 
    { 

     private IMyObjectsService _myObjectsService; 

     List<ObjModel> myObjects { get; set; } = new List<ObjModel>(); 

     RecyclerView mRecyclerView; 

     RecyclerView.LayoutManager mLayoutManager; 

     MyObjectsRecyclerViewAdapter mAdapter; 



     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      _myObjectsService = ServiceLocator.Current.GetInstance<IMyObjectsService>(); 

     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 

      View view = inflater.Inflate(Resource.Layout.fragment_my_objects_list, container, false) as View; 

      mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.MyRecyclerView); 


      mLayoutManager = new LinearLayoutManager(mRecyclerView.Context); 


      mRecyclerView.SetLayoutManager(mLayoutManager); 

      return view; 
     } 

     public override void OnResume() 
     { 
      base.OnResume(); 
      Task.Run(async() => { 
       try 
       { 
        myObjects = await GetMyObjectsAsync(); // Here it's not awaited the result why ? 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 

      }); 
      mAdapter = new MyObjectsRecyclerViewAdapter(myObjects); 
      Console.WriteLine("--------------------OnResume Called-------------------- " + myObjects.Count()); // Always 0 why ? 

      mRecyclerView.SetAdapter(mAdapter); 
     } 



     private async Task<List<ObjModel>> GetMyObjectsAsync(){ 
      Console.WriteLine("--------------------GetMyObjectsAsync Called--------------------"); 
      var result = await _myObjectsService.GetAllAsync(); // Get objects in sqlite databases 
      Console.WriteLine("-------------------- result" + result.Value.Count() + "--------------------"); // Return the correct value for example 5 

      List<ObjModel> myOjectsTmp = new List<ObjModel>(); 


      if (!result.HasErrors && result.HasValue) 
      { 
       foreach (var obj in result.Value) 
       { 
        myOjectsTmp.Add(obj); 
       } 
       Console.WriteLine("-------------------- myOjectsTmp"+ myOjectsTmp.Count() + "--------------------"); // Return the correct value for example 5 
      } 

      return myOjectsTmp; 
     } 


    } 
} 
+0

はどうすればよそれが待たれていないことを知っていますか? –

+0

@ NongthonbamTonthoi try catchのmyObjectsは、GetMyObjectsAsync()メソッドの結果ではなく、常に5を返すため、何も表示されません。コンソールのWriteLineも参照してください – fandro

+0

戻り値の型なしで 'GetMyObjectsAsync()'を呼び出すだけです。 GetMyObjectsAsync()内のループの後にアダプターを設定します。 –

答えて

1

これを試してみてください:

移動し、これらの2行:

mAdapter = new MyObjectsRecyclerViewAdapter(myObjects); 
mRecyclerView.SetAdapter(mAdapter); 

myObjects = await GetMyObjectsAsync(); 

のように後:

myObjects = await GetMyObjectsAsync(); 
Activity.RunOnUiThread(() => 
        { 
    mAdapter = new MyObjectsRecyclerViewAdapter(myObjects); 
    mRecyclerView.SetAdapter(mAdapter); 
}); 
+0

他のソリューションと同じ動作が、私はアプリケーションの出力にこのメッセージがあります: "オリジナルビュー階層を作成したスレッドがそのビューに触れることができます。 – fandro

+0

myObjectsが正しい値になりました – fandro

+0

これは動作しているようですが、さらにテストをする必要があります。私には分を教えてくれるでしょう – fandro

関連する問題