0

我几乎是这样的:https://github.com/RyanHurst/TvProgramRecyclerView。水平recyclerviews作为垂直回收视图的项目。每个水平回收站视图滚动都是同步的(只有可见项目)。水平recyclerview垂直recyclerview滚动性能内

Horizo​​tal滚动非常流畅,但垂直滚动非常糟糕。在水平滚动的位置0滚动时,它运行得非常好,但是最多的是向右滚动到最慢的位置。我试图不在onBinViewHolder中设置回收站适配器,并为每个水平回收站使用一个普通的recyclerviewpool,而不是任何东西。

回答

0

尝试在父RecyclerView

+0

我曾尝试过之前 –

2

设置setNestedScrollingEnabled(假)对于外部垂直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

@Mick我从这篇文章中借来的,为我的用例做了一些修改。 IIRC,内部recyclerview的滚动存在一个小问题。我在我的应用程序中使用上面的两个类,它工作得很好。 – milindbableshwar

相关问题