私は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;
}
}
}
はどうすればよそれが待たれていないことを知っていますか? –
@ NongthonbamTonthoi try catchのmyObjectsは、GetMyObjectsAsync()メソッドの結果ではなく、常に5を返すため、何も表示されません。コンソールのWriteLineも参照してください – fandro
戻り値の型なしで 'GetMyObjectsAsync()'を呼び出すだけです。 GetMyObjectsAsync()内のループの後にアダプターを設定します。 –