0

У меня есть почти следующее: https://github.com/RyanHurst/TvProgramRecyclerView. Горизонтальные рециркуляции как элемент вертикального рециркуляции. Каждая горизонтальная прокрутка recyclerview синхронизирована (только видимые элементы).Горизонтальная рециркуляция внутри вертикальной перепрограммирования прокрутки

Горизонтальная прокрутка очень гладкая, но вертикальная прокрутка действительно плохая. Когда свитки в положении 0 на горизонтальном прокрутке, он работает очень хорошо, но больше всего вы прокручиваете вправо, что наиболее лагги это становится. Я старался не устанавливать адаптер recycler в onBinViewHolder и использовать обычный recyclerviewpool для каждого горизонтального ресайклера и ничего.

ответ

0

Попробуйте установить setNestedScrollingEnabled (ложный) на материнской RecyclerView

+0

Я пробовал это до –

2

Для наружной вертикальной RecyclerView, использовать этот расширенный класс:

public class BetterRecyclerView extends RecyclerView{ 
    private static final int INVALID_POINTER = -1; 
    private int mScrollPointerId = INVALID_POINTER; 
    private int mInitialTouchX, mInitialTouchY; 
    private int mTouchSlop; 
    public BetterRecyclerView(Context context) { 
    this(context, null); 
    } 

    public BetterRecyclerView(Context context, @Nullable AttributeSet attrs) { 
    this(context, attrs, 0); 
    } 

    public BetterRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    final ViewConfiguration vc = ViewConfiguration.get(getContext()); 
    mTouchSlop = vc.getScaledTouchSlop(); 
    } 

    @Override 
    public void setScrollingTouchSlop(int slopConstant) { 
    super.setScrollingTouchSlop(slopConstant); 
    final ViewConfiguration vc = ViewConfiguration.get(getContext()); 
    switch (slopConstant) { 
     case TOUCH_SLOP_DEFAULT: 
     mTouchSlop = vc.getScaledTouchSlop(); 
     break; 
     case TOUCH_SLOP_PAGING: 
     mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(vc); 
     break; 
     default: 
     break; 
    } 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e) { 
    final int action = MotionEventCompat.getActionMasked(e); 
    final int actionIndex = MotionEventCompat.getActionIndex(e); 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
     mScrollPointerId = MotionEventCompat.getPointerId(e, 0); 
     mInitialTouchX = (int) (e.getX() + 0.5f); 
     mInitialTouchY = (int) (e.getY() + 0.5f); 
     return super.onInterceptTouchEvent(e); 

     case MotionEventCompat.ACTION_POINTER_DOWN: 
     mScrollPointerId = MotionEventCompat.getPointerId(e, actionIndex); 
     mInitialTouchX = (int) (MotionEventCompat.getX(e, actionIndex) + 0.5f); 
     mInitialTouchY = (int) (MotionEventCompat.getY(e, actionIndex) + 0.5f); 
     return super.onInterceptTouchEvent(e); 

     case MotionEvent.ACTION_MOVE: { 
     final int index = MotionEventCompat.findPointerIndex(e, mScrollPointerId); 
     if (index < 0) { 
      return false; 
     } 

     final int x = (int) (MotionEventCompat.getX(e, index) + 0.5f); 
     final int y = (int) (MotionEventCompat.getY(e, index) + 0.5f); 
     if (getScrollState() != SCROLL_STATE_DRAGGING) { 
      final int dx = x - mInitialTouchX; 
      final int dy = y - mInitialTouchY; 
      final boolean canScrollHorizontally = getLayoutManager().canScrollHorizontally(); 
      final boolean canScrollVertically = getLayoutManager().canScrollVertically(); 
      boolean startScroll = false; 
      if (canScrollHorizontally && Math.abs(dx) > mTouchSlop && (Math.abs(dx) >= Math.abs(dy) || canScrollVertically)) { 
      startScroll = true; 
      } 
      if (canScrollVertically && Math.abs(dy) > mTouchSlop && (Math.abs(dy) >= Math.abs(dx) || canScrollHorizontally)) { 
      startScroll = true; 
      } 
      return startScroll && super.onInterceptTouchEvent(e); 
     } 
     return super.onInterceptTouchEvent(e); 
     } 

     default: 
     return super.onInterceptTouchEvent(e); 
    } 
    } 
} 

Для внутренней горизонтальной RecyclerView, использовать этот расширенный класс:

public class FeedRootRecyclerView extends BetterRecyclerView{ 
    public FeedRootRecyclerView(Context context) { 
    this(context, null); 
    } 

    public FeedRootRecyclerView(Context context, @Nullable AttributeSet attrs) { 
    this(context, attrs, 0); 
    } 

    public FeedRootRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    } 

    @Override 
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
`` /* do nothing */ 
    } 
} 

Вы можете найти правильное объяснение того, что делают эти занятия здесь: http://nerds.headout.com/fix-horizontal-scrolling-in-your-android-app/

+0

Отличная ссылка, ваш ответ неправильный, хотя - оба предназначены для внешнего вертикального просмотра Recycler. – Mick

+0

@ Мик Я заимствовал из статьи и сделал пару изменений для моего варианта использования. IIRC, была небольшая проблема с прокруткой внутренней recyclerview. Я использую эти два класса в своем приложении, и он работает отлично. – milindbableshwar

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

  • Нет связанных вопросов^_^