2015-08-04 3 views
0

В нашем приложении у нас есть RecyclerView, который показывает большие предметы в горизонтальном списке. Для этого мы используем LinearLayoutManager. Проблема возникает, когда пользователь прокручивает экран. Когда на экране появляются следующие большие элементы, пользовательский интерфейс заморожен.RecyclerView для больших предметов

То, что мы хотели реализовать, - это какая-то ленивая загрузка для RecyclerView. Так что, как и пользователь facebook, пользователь увидел заглушку, и как только он остановил прокрутку, пользовательский интерфейс обновился, чтобы показать фактический контент.

Вопрос в том, что такое правильная точка расширения для этого? Должен ли я реализовать пользовательский LayoutManager? Или существуют существующие решения для этого?

+0

вы можете поставить на код, чтобы показать что вы сейчас делаете? – Psest328

+0

Я не уверен, какой код поставить здесь. Вот код для просмотра recycler, который мы используем https://github.com/MvvmCross/MvvmCross-AndroidSupport/tree/master/Cirrious.MvvmCross.Droid.Support.RecyclerView – Sly

ответ

2

Если вы используете Xamarin, как тег говорят, что вы можете сделать это:

public class XamarinRecyclerViewOnScrollListener : RecyclerView.OnScrollListener 
{ 
    public delegate void LoadMoreEventHandler(object sender, EventArgs e); 
    public event LoadMoreEventHandler LoadMoreEvent; 

    private LinearLayoutManager LayoutManager; 

    public XamarinRecyclerViewOnScrollListener (LinearLayoutManager layoutManager) 
    { 
     LayoutManager = layoutManager; 
    } 

    public override void OnScrolled (RecyclerView recyclerView, int dx, int dy) 
    { 
     base.OnScrolled (recyclerView, dx, dy); 

     var visibleItemCount = recyclerView.ChildCount; 
     var totalItemCount = recyclerView.GetAdapter().ItemCount; 
     var pastVisiblesItems = LayoutManager.FindFirstVisibleItemPosition(); 

     if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
      LoadMoreEvent (this, null); 
     } 
    } 
} 

Чтобы использовать это в использовании вид:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     var view = base.OnCreateView(inflater, container, savedInstanceState); 

     var recyclerView = view.FindViewById<RecyclerView>(Resource.Id.my_recycler_view); 
     if (recyclerView != null) 
     { 
      recyclerView.HasFixedSize = true; 

      var layoutManager = new LinearLayoutManager(Activity); 

      var onScrollListener = new XamarinRecyclerViewOnScrollListener (layoutManager); 
      onScrollListener.LoadMoreEvent += (object sender, EventArgs e) => { 
       //Load more stuff here 
      }; 

      recyclerView.AddOnScrollListener (onScrollListener); 

      recyclerView.SetLayoutManager(layoutManager); 
     } 
     return view; 
    } 
0

Не видя, что именно вы делаете, я могу сделать только предложение на высоком уровне. И это предложение добавляет прослушиватель прокрутки к recyclerView.

Как это работает для вас?

 final int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
    final int lastVisiblePosition = layoutManager.findLastVisibleItemPosition(); 

    myRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
     } 

     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 

      switch (newState) { 
       case RecyclerView.SCROLL_STATE_IDLE: 
        for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) { 
         // start content loading here 
         recyclerView.getChildAt(i).loadMyContent; 
        } 
        break; 
       case RecyclerView.SCROLL_STATE_DRAGGING: 
        for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) { 
         // cancel content loading here 
         recyclerView.getChildAt(i).cancelLoad; 
        } 
        break; 
       case RecyclerView.SCROLL_STATE_SETTLING: 
        // you could load content here, but it could end up off screen by the time it stops, so I would not recommend it 
        break; 
      } 
     } 
    }); 

Я хотел бы добавить, что если вы загружаете изображения, посмотри на Picasso library:

От страницы Пикассо:

ADAPTER СКАЧАТЬ

адаптер РЕМОНТ использование автоматически обнаруживается и предыдущая загрузка отменяется.

@Override public void getView(int position, View convertView, ViewGroup parent) { 
    SquaredImageView view = (SquaredImageView) convertView; 
    if (view == null) { 
    view = new SquaredImageView(context); 
    } 
    String url = getItem(position); 

    Picasso.with(context).load(url).into(view); 
} 
Смежные вопросы