Android fragments Xamarin Android片段在ViewModel就绪之前显示视图
我对等待异步方法有问题。我有一个片段(SalesFragment),它包含两个片段(FirstSalesFragment和SecondSalesFragment)的TabLayout。当我展示SalesFragment时,在TableLayout中选择了FirstSalesFragment,我在ViewModel中有一个异步方法,它调用API并给我一些数据。但问题是在FirstSalesFragment中,我有Microcharts布局,我想在那里显示图表,但主要问题是我的图表条目来自Api的异步方法,OnCreateView方法只是不等待ViewModel中的异步方法 我的FirstSales视图刚刚显示,但图表为空,因为OnCreateView不等待条目。。。我尝试了ActivityCreated或OnStart方法,但它是相同的 我的SalesFragmentAndroid fragments Xamarin Android片段在ViewModel就绪之前显示视图,android-fragments,asynchronous,xamarin,xamarin.android,mvvmcross,Android Fragments,Asynchronous,Xamarin,Xamarin.android,Mvvmcross,我对等待异步方法有问题。我有一个片段(SalesFragment),它包含两个片段(FirstSalesFragment和SecondSalesFragment)的TabLayout。当我展示SalesFragment时,在TableLayout中选择了FirstSalesFragment,我在ViewModel中有一个异步方法,它调用API并给我一些数据。但问题是在FirstSalesFragment中,我有Microcharts布局,我想在那里显示图表,但主要问题是我的图表条目来自Api的异
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_view = base.OnCreateView(inflater, container, savedInstanceState);
var viewPager = _view.FindViewById<ViewPager>(Resource.Id.viewpager);
if (viewPager != null)
{
var fragments = new List<MvxViewPagerFragmentInfo>
{
new MvxViewPagerFragmentInfo(ViewModel.FirstSalesTab, typeof(FirstSalesFragment), typeof(FirstSalesViewModel)),
new MvxViewPagerFragmentInfo(ViewModel.SecondSalesTab, typeof(SecondSalesFragment), typeof(SecondSalesViewModel))
};
viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(Activity, ChildFragmentManager, fragments);
}
var tabLayout = _view.FindViewById<TabLayout>(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
return _view;
}
public class FirstSalesFragment : BaseFragment<FirstSalesViewModel>
{
protected override int FragmentId => Resource.Layout.fragment_firstsales;
private View _view;
private ChartView _chartView;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_view = base.OnCreateView(inflater, container, savedInstanceState);
_chartView = _view.FindViewById<ChartView>(Resource.Id.chartView);
if (_chartView != null)
{
InitializeChart();
}
return _view;
}
private void InitializeChart()
{
var tempEntries = ViewModel.Entries;
if (tempEntries == null || tempEntries.Count == 0)
{
_chartView.Chart = null;
return;
}
var tempChart = new LineChart
{
Entries = tempEntries,
LineMode = LineMode.Straight,
LineSize = 5,
LabelTextSize = 25,
AnimationDuration = new TimeSpan(0, 0, 5),
BackgroundColor = SKColor.Parse("#EEEEEE")
};
_chartView.Chart = tempChart;
}
}
public override视图OnCreateView(布局、充气机、视图组容器、Bundle savedInstanceState)
{
_视图=base.OnCreateView(充气机、容器、savedInstanceState);
var viewPager=\u view.findviewbyd(Resource.Id.viewPager);
if(viewPager!=null)
{
var fragments=新列表
{
新的MvxViewPagerFragmentInfo(ViewModel.FirstSalesTab,typeof(FirstSalesFragment),typeof(FirstSalesViewModel)),
新的MvxViewPagerFragmentInfo(ViewModel.SecondSalesTab,typeof(SecondSalesFragment),typeof(SecondSalesViewModel))
};
viewPager.Adapter=新的MvxCachingFragmentStatePagerAdapter(活动、子碎片管理器、碎片);
}
var tabLayout=\u view.findviewbyd(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
返回视图;
}
FirstSalesViewModel:
public class FirstSalesViewModel : BaseViewModel
{
private readonly ISessionInfo _session;
private readonly IInfoMessageReporter _infoMessageReporter;
public FirstSalesViewModel()
{
_session = Mvx.Resolve<ISessionInfo>();
_infoMessageReporter = Mvx.Resolve<IInfoMessageReporter>();
}
public async Task Initialize()
{
}
public void Init()
{
Task.Run(InitializeHourlySales);
}
private async Task InitializeHourlySales()
{
// Call API async service... initialize Entries here....
}
private List<Entry> _entries;
public List<Entry> Entries
{
get { return _entries; }
set
{
_entries = value;
RaisePropertyChanged(() => Entries);
}
}
}
}
公共类FirstSalesViewModel:BaseViewModel
{
专用只读ISessionInfo会话;
私有只读IInfoMessageReporter _infoMessageReporter;
public FirstSalesViewModel()
{
_session=Mvx.Resolve();
_infoMessageReporter=Mvx.Resolve();
}
公共异步任务初始化()
{
}
公共void Init()
{
Task.Run(初始化hourlysales);
}
专用异步任务初始化HourlySales()
{
//调用API异步服务…在此初始化项。。。。
}
私人名单(条目);;
公开列表条目
{
获取{return\u entries;}
设置
{
_条目=值;
RaisePropertyChanged(()=>条目);
}
}
}
}
FirstSalesFragment
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_view = base.OnCreateView(inflater, container, savedInstanceState);
var viewPager = _view.FindViewById<ViewPager>(Resource.Id.viewpager);
if (viewPager != null)
{
var fragments = new List<MvxViewPagerFragmentInfo>
{
new MvxViewPagerFragmentInfo(ViewModel.FirstSalesTab, typeof(FirstSalesFragment), typeof(FirstSalesViewModel)),
new MvxViewPagerFragmentInfo(ViewModel.SecondSalesTab, typeof(SecondSalesFragment), typeof(SecondSalesViewModel))
};
viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(Activity, ChildFragmentManager, fragments);
}
var tabLayout = _view.FindViewById<TabLayout>(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
return _view;
}
public class FirstSalesFragment : BaseFragment<FirstSalesViewModel>
{
protected override int FragmentId => Resource.Layout.fragment_firstsales;
private View _view;
private ChartView _chartView;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_view = base.OnCreateView(inflater, container, savedInstanceState);
_chartView = _view.FindViewById<ChartView>(Resource.Id.chartView);
if (_chartView != null)
{
InitializeChart();
}
return _view;
}
private void InitializeChart()
{
var tempEntries = ViewModel.Entries;
if (tempEntries == null || tempEntries.Count == 0)
{
_chartView.Chart = null;
return;
}
var tempChart = new LineChart
{
Entries = tempEntries,
LineMode = LineMode.Straight,
LineSize = 5,
LabelTextSize = 25,
AnimationDuration = new TimeSpan(0, 0, 5),
BackgroundColor = SKColor.Parse("#EEEEEE")
};
_chartView.Chart = tempChart;
}
}
public类FirstSalesFragment:BaseFragment
{
受保护的覆盖int FragmentId=>Resource.Layout.fragment\u firstsales;
私有视图(u视图),;
私人海图(ChartView);;
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
_视图=base.OnCreateView(充气机、容器、savedInstanceState);
_chartView=\u view.FindViewById(Resource.Id.chartView);
如果(_chartView!=null)
{
InitializeChart();
}
返回视图;
}
私有void InitializeChart()
{
var tempEntries=ViewModel.Entries;
if(tempEntries==null | | tempEntries.Count==0)
{
_chartView.Chart=null;
返回;
}
var tempChart=新折线图
{
条目=临时条目,
LineMode=LineMode.直线,
线条尺寸=5,
LabelTextSize=25,
AnimationDuration=新的时间跨度(0,0,5),
BackgroundColor=SKColor.Parse(“#EEEEEE”)
};
_chartView.Chart=tempChart;
}
}
在支持使用异步的OnResume中调用异步代码
我稍微修改了您的代码示例,并在FirstSalesFragment的OnResume()中调用了ViewModel.Init()
FirstSalesViewModel
第一段
。。。
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
_视图=base.OnCreateView(充气机、容器、savedInstanceState);
_chartView=\u view.FindViewById(Resource.Id.chartView);
返回视图;
}
公共异步重写void OnResume()
{
base.OnResume();
等待ViewModel.Init();
如果(_chartView!=null)
{
InitializeChart();
}
}
...
从服务中获取数据后,您的图表是否会更新数据?无论如何,我认为您没有完全掌握async
和wait
以及它们的操作方式。当然,您可以尝试在pageload上获取数据。在xamarin.forms中,可以使用OnAppearing
方法。或者,您可以强制调用以在主线程上运行数据,这样数据将首先出现,然后执行代码的其余部分。@IdevDev从服务中获取数据后,没有图表不更新这是我的主要问题…数据是否出现?你试过调试它吗?你不应该检查图表是否为空,而不是相反吗??我的意思是如果(_chartView!=null),那么这一行就是。如果(_chartView==null)
,我认为这应该是这样的;bindset.Bind(_chartView).For(q=>q.Chart).To(vm=>vm.Chart);bindset.Apply()代码>在ViewModel中,我有属性图,而不是条目,它可以工作。。。但是我不知道。。。。如果它是最好的解决方案