【问题标题】:horizontal recyclerview inside vertical recycerview adapter垂直recyclerview适配器内的水平recyclerview
【发布时间】:2016-05-07 13:29:10
【问题描述】:

enter code here 我正在使用 recyclerview 但我需要再实现一个 recyclerview 在 recyclerview 的适配器布局内。能 有人告诉我如何将 json 数据设置为 recyclerview 这是在vertical recycler的cardview里面。不要告诉我 关于如何设置水平 recyclerview 我非常了解。 我的问题是我很困惑如何将数据设置为 垂直recyclerview的cardview里面的recyclerview

【问题讨论】:

  • 能否添加您目前尝试过的代码?

标签: android android-studio android-recyclerview


【解决方案1】:

您可以将List> 传递给垂直RecyclerView 的适配器,然后在onBindViewHolder 中,将某个索引处的内部列表i 传递给水平RecyclerView 适配器的构造函数。

【讨论】:

    【解决方案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/

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 2015-11-30
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2015-12-17
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多