解决scrollView嵌套RecyclerView导致Recy

2020-09-22  本文已影响0人  T_Y_H

现状

问题分析

int fill(RecyclerView.Recycler recycler, LayoutState layoutState,
       ....
       // 这个地方为true会导致adapter的onCreateViewHolder调用,正常情况下layoutState.mInfinite为false,影响recycleView子childView数量的是
        // remainingSpace > 0和layoutState.hasMore(state)
       while ((layoutState.mInfinite || remainingSpace > 0) && layoutState.hasMore(state)) {
          .....
       }       
   }
  public static OrientationHelper createVerticalHelper(RecyclerView.LayoutManager layoutManager) {
        return new OrientationHelper(layoutManager) {
            .......
            @Override
            public int getEnd() {
                return mLayoutManager.getHeight();
            }

            @Override
            public int getMode() {
                return mLayoutManager.getHeightMode();
            }
            ......
           
        };
    }

解决方案

public class CustomRecyclerView extends RecyclerView {


    public CustomRecyclerView(@NonNull Context context) {
        super(context);
    }

    public CustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        //MeasureSpec.UNSPECIFIED 模式会导致LinearLayoutManager中的fill方法中判断是否可以无限制填冲整个recycleview为true,从而导致RecyclerView的复用失效
        if (MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED) {
            int size = MeasureSpec.getSize(heightSpec);
            heightSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthSpec, heightSpec);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读