C# RecyclerView中的OxyPlot-MVVMCross Xamarin.Android
我有下面的实现,其中我有recycler视图,在每个视图中我都试图使用OxyPlot显示数据 我可以在每张卡上看到硬编码的绘图值,但当我滚动时,它的响应有点慢,应用程序冻结了一段时间。我想知道我做错了什么,或者如何改进这个性能问题 MainView.xmlC# RecyclerView中的OxyPlot-MVVMCross Xamarin.Android,c#,xamarin,xamarin.android,mvvmcross,oxyplot,C#,Xamarin,Xamarin.android,Mvvmcross,Oxyplot,我有下面的实现,其中我有recycler视图,在每个视图中我都试图使用OxyPlot显示数据 我可以在每张卡上看到硬编码的绘图值,但当我滚动时,它的响应有点慢,应用程序冻结了一段时间。我想知道我做错了什么,或者如何改进这个性能问题 MainView.xml 我没能从这个问题中得到你的例子。但是,您可以尝试将数据打印点绑定到布局,而不是将ViewModel重新构造为适配器中的标准类对象 实施示例: 视图模型 为了简单起见,我刚刚创建了一个简单的ObservableCollection,其中包含重复
我没能从这个问题中得到你的例子。但是,您可以尝试将数据打印点绑定到布局,而不是将ViewModel重新构造为适配器中的标准类对象 实施示例: 视图模型 为了简单起见,我刚刚创建了一个简单的ObservableCollection,其中包含重复几次的相同绘图点图形形状组。更新:作为一个实例,您必须确保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<PlotModel> GenerateGraph()
{
var graphPlots = new List<PlotModel>();
int counter = 0;
while (counter < 10)
{
graphPlots.Add(GeneratePlotPoints());
counter++;
}
return graphPlots;
}
public List<PlotModel> GraphPlots => GenerateGraph();
}
看法
更新-包括屏幕截图
我没能从这个问题中得到你的例子。但是,您可以尝试将数据打印点绑定到布局,而不是将ViewModel重新构造为适配器中的标准类对象 实施示例: 视图模型 为了简单起见,我刚刚创建了一个简单的ObservableCollection,其中包含重复几次的相同绘图点图形形状组。更新:作为一个实例,您必须确保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<PlotModel> GenerateGraph()
{
var graphPlots = new List<PlotModel>();
int counter = 0;
while (counter < 10)
{
graphPlots.Add(GeneratePlotPoints());
counter++;
}
return graphPlots;
}
public List<PlotModel> GraphPlots => GenerateGraph();
}
看法
更新-包括屏幕截图
在ViewModel中,您的sAll列表是什么样子的?您应该能够使用XML绑定simliar到,但基于列表中的模型。我已经用工作示例更新了我的问题,但现在我遇到了性能问题。当我把每张图放在每张卡片上并滚动时,速度很慢。我想知道我哪里做错了?在ViewModel中,您的sAll列表是什么样子的?您应该能够使用XML绑定simliar到,但基于列表中的模型。我已经用工作示例更新了我的问题,但现在我遇到了性能问题。当我把每张图放在每张卡片上并滚动时,速度很慢。我想知道我哪里做错了?非常感谢您的努力,而且还有非常清晰的解释。没问题,很高兴它有帮助。@占位符,我刚刚有机会测试您的解决方案,但由于某种原因,什么都没有显示。你测试过吗?在我看来,local:MvxBind=Model。它不起作用。您添加了自定义绑定吗?如果是,你能把它也包括进去吗?@HotSping,你可以查看,OxyPlot的内容可以在HelpAndFeedback部分找到。希望有帮助。非常感谢您所做的一切努力,并提供了非常清晰的解释。没问题,很高兴它有帮助。@占位符,我刚刚有机会测试您的解决方案,但由于某些原因,没有显示任何结果。你测试过吗?在我看来,local:MvxBind=Model。它不起作用。您添加了自定义绑定吗?如果是,你能把它也包括进去吗?@HotSping,你可以查看,OxyPlot的内容可以在HelpAndFeedback部分找到。希望能有帮助。
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<MvxRecyclerView>(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;
}
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<PlotView>(Resource.Id.Plot);
MainViewModel MyMainViewModel = new MainViewModel();
cardOptionsButton.Model = MyMainViewModel.MyModel;
}
}
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); }
}
}
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<PlotModel> GenerateGraph()
{
var graphPlots = new List<PlotModel>();
int counter = 0;
while (counter < 10)
{
graphPlots.Add(GeneratePlotPoints());
counter++;
}
return graphPlots;
}
public List<PlotModel> GraphPlots => GenerateGraph();
}
<MvxRecyclerView
android:id="@+id/myRecyclerView"
android:layout_marginTop="10dp"
android:scrollbars="vertical"
android:divider="@null"
android:layout_width="match_parent"
android:layout_height="match_parent"
local:MvxBind="ItemsSource GraphPlots"
local:MvxItemTemplate="@layout/mycardview" />
<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<oxyplot.xamarin.android.PlotView
android:id="@+id/Plot"
android:layout_width="match_parent"
android:layout_height="match_parent"
local:MvxBind="Model ."/>
</RelativeLayout>
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<MvxRecyclerView>(Resource.Id.myRecyclerView);
if (cardRecyclerView != null)
{
cardRecyclerView.HasFixedSize = false;
var layoutManager = new LinearLayoutManager(Activity);
cardRecyclerView.SetLayoutManager(layoutManager);
}
return view;
}