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; } 

更新 – 包含屏幕截图

在此处输入图像描述