2016-07-12 2 views
2

У меня есть следующая реализация, где у меня есть просмотр recycler, в каждом представлении я пытаюсь отобразить данные с использованием OxyPlot.OxyPlot в RecyclerView -MVVMCross Xamarin.Android

Я мог видеть жестко закодированные Plotvalues ​​на каждой карте, но когда я прокручиваю, это своего рода медленный ответ, и приложение замерзает. Интересно, что я делаю неправильно или как улучшить эту проблему производительности?

MainView.xml

<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:MvxItemTemplate="@layout/mycardview" /> 

mycardview.xml

<RelativeLayout 
    android:layout_width="200dp" 
    android:layout_height="match_parent"> 
    <oxyplot.xamarin.android.PlotView 
     android:id="@+id/Plot" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

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

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<PlotView>(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); } 
    } 
} 
+0

Что делает ваш "Саль" Лис t выглядеть в вашей ViewModel? Вы должны просто использовать XML-привязку к https://stackoverflow.com/questions/38316666/binding-oxyplot-via-mvvmcross-in-xamarin-android/38336559#38336559, но основываясь на модели из вашего списка , – Plac3Hold3r

+0

Я обновил свой вопрос с помощью рабочего примера, но теперь у меня проблема с производительностью. Когда я помещаю каждый сюжет на каждую карту и прокручиваю их, это медленно. Интересно, что я делаю неправильно? – hotspring

ответ

4

Я не был в состоянии получить ваш пример от вопроса к работе. Однако вы можете попытаться использовать привязку для данных (точки графика) к вашему макету, а не перестраивать свой ViewModel в качестве стандартного объекта класса в Adapter.


Пример реализации:

ViewModel

Для простоты я только что создали простой ObservableCollection, который содержит те же группы точек участка (график форма) повторяется несколько раз. ОБНОВЛЕНИЕ: В качестве PlotModel can only be used once in an 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<PlotModel> GenerateGraph() 
    { 
     var graphPlots = new List<PlotModel>(); 
     int counter = 0; 

     while (counter < 10) 
     { 
      graphPlots.Add(GeneratePlotPoints()); 
      counter++; 
     } 

     return graphPlots; 
    } 

    public List<PlotModel> GraphPlots => GenerateGraph(); 
} 

Layout

Ваш главный макет с RecyclerView.

<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" /> 

mycardview макет макета. Обратите внимание, что использование точки используется для указания Mvx привязываться ко всей модели (в данном случае PlotModel), но ее также можно оставить пустой (Mvx doc link).

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

Update - Добавить скриншот

enter image description here

+0

Большое спасибо за все усилия и, кроме того, за кристально чистое объяснение. – hotspring

+1

Без проблем, рад, что это помогло. – Plac3Hold3r

+0

@Placeholder, у меня только есть шанс проверить ваше решение, но почему-то ничего не появляется. Вы протестировали? – hotspring

Смежные вопросы