RecyclerView -MVVMCross Xamarin.Android中的OxyPlot
我有以下实现,其中我有recycleler视图,在每个视图中我试图使用OxyPlot显示数据。
我能够在每张卡上看到硬编码的Plotvalues,但是当我滚动时,它是一种缓慢的响应并且app会冻结一段时间。 我想知道我做错了什么或如何改善这个性能问题?
MainView.xml
mycardview.xml
MainView.cs
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { var ignored = base.OnCreateView(inflater, container, savedInstanceState); var view = this.BindingInflate(Resource.Layout.MainView, null); HasOptionsMenu = true; var cardRecyclerView = view.FindViewById(Resource.Id.myRecyclerView); if (cardRecyclerView != null) { cardRecyclerView.HasFixedSize = false; cardRecyclerView .Adapter = new MainViewRecyclerAdapter((IMvxAndroidBindingContext)BindingContext, Activity); var layoutManager = new LinearLayoutManager(Activity); cardRecyclerView.SetLayoutManager(layoutManager); } return view; }
MainViewRecyclerAdapter .cs
public class MainViewRecyclerAdapter : MvxRecyclerAdapter { private readonly FragmentActivity _activity; public MainViewRecyclerAdapter(IMvxAndroidBindingContext bindingContext, FragmentActivity activity) : base(bindingContext) { _activity = activity; } public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { base.OnBindViewHolder(holder, position); var view = holder.ItemView; var cardOptionsButton = view.FindViewById(Resource.Id.Plot); MainViewModel MyMainViewModel = new MainViewModel(); cardOptionsButton.Model = MyMainViewModel.MyModel; } }
MyMainViewModel.cs
public class MyViewModel : MvxViewModel { public MyViewModel() { GeneratePlotPoints(); } void GeneratePlotPoints() { var mo = new PlotModel(); var s1 = new LineSeries() { Color = OxyColors.SkyBlue, MarkerType = MarkerType.Circle, MarkerSize = 6, MarkerStroke = OxyColors.White, MarkerFill = OxyColors.SkyBlue, MarkerStrokeThickness = 1.5 }; s1.Points.Add(new DataPoint(0, 10)); s1.Points.Add(new DataPoint(10, 40)); s1.Points.Add(new DataPoint(40, 20)); s1.Points.Add(new DataPoint(60, 30)); mo.Series.Add(s1); MyModel = mo; } PlotModel _myModel; public PlotModel MyModel { get { return _myModel; } set { SetProperty(ref _myModel, value); } } }
我无法从问题中得到你的榜样。 但是,您可以尝试使用绑定将数据(绘图点)绑定到布局,而不是将ViewModel
重新构建为Adapter
的标准类对象。
实施例:
视图模型
为简单起见,我刚刚创建了一个简单的ObservableCollection
,它包含重复几次相同的绘图点组(图形形状)。 更新:由于PlotModel
只能在PlotView
使用一次, PlotView
您必须确保PlotModel
始终是一个新实例。
public class MyViewModel : BaseViewModel { PlotModel GeneratePlotPoints() { var mo = new PlotModel(); var s1 = new LineSeries() { Color = OxyColors.SkyBlue, MarkerType = MarkerType.Circle, MarkerSize = 6, MarkerStroke = OxyColors.White, MarkerFill = OxyColors.SkyBlue, MarkerStrokeThickness = 1.5 }; s1.Points.Add(new DataPoint(0, 10)); s1.Points.Add(new DataPoint(10, 40)); s1.Points.Add(new DataPoint(40, 20)); s1.Points.Add(new DataPoint(60, 30)); mo.Series.Add(s1); return mo; } List GenerateGraph() { var graphPlots = new List (); int counter = 0; while (counter < 10) { graphPlots.Add(GeneratePlotPoints()); counter++; } return graphPlots; } public List GraphPlots => GenerateGraph(); }
布局
您使用RecyclerView的主要布局。
mycardview
布局模板。 请注意,使用该点用于告诉Mvx绑定到整个模型(在本例中为PlotModel),但它也可以留空( Mvx doc链接 )。
视图
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { var ignored = base.OnCreateView(inflater, container, savedInstanceState); var view = this.BindingInflate(Resource.Layout.MainView, null); HasOptionsMenu = true; var cardRecyclerView = view.FindViewById(Resource.Id.myRecyclerView); if (cardRecyclerView != null) { cardRecyclerView.HasFixedSize = false; var layoutManager = new LinearLayoutManager(Activity); cardRecyclerView.SetLayoutManager(layoutManager); } return view; }
更新 – 包含屏幕截图