RecyclerView常见问题

526 阅读1分钟

1、数据不显示,看源码

void dispatchLayout() {
        if (mAdapter == null) {
            Log.e(TAG, "No adapter attached; skipping layout");
            // leave the state in START
            return;
        }
        if (mLayout == null) {
            Log.e(TAG, "No layout manager attached; skipping layout");
            // leave the state in START
            return;
        }
        mState.mIsMeasuring = false;
        if (mState.mLayoutStep == State.STEP_START) {
            dispatchLayoutStep1();
            mLayout.setExactMeasureSpecsFrom(this);
            dispatchLayoutStep2();
        } else if (mAdapterHelper.hasUpdates() || mLayout.getWidth() != getWidth()
                || mLayout.getHeight() != getHeight()) {
            // First 2 steps are done in onMeasure but looks like we have to run again due to
            // changed size.
            mLayout.setExactMeasureSpecsFrom(this);
            dispatchLayoutStep2();
        } else {
            // always make sure we sync them (to ensure mode is exact)
            mLayout.setExactMeasureSpecsFrom(this);
        }
        dispatchLayoutStep3();
    }

再有数据的情况下,应该是适配器为空或者没有设备LayoutManager

2、recyclerview嵌套CheckBox加载混乱问题

https://juejin.cn/post/6844903764663468045

3、滚动到指定位置

smoothScrollToPosition();

4、计算recyclerview高度

数据渲染成功之前recyclerview.getMeasuredHeight()得到的必然是0(其他的控件在onCreate执行的时候得到的必然也是0)

方法一:

recyclerview.measure(0, 0);
recyclerview.getMeasuredHeight()

方法二:

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
		viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {
				view.getHeight();
				view.getWidth();
			}
		});

ViewTreeObserver是用来监听视图树变化的监听器,亦可以 View.getViewTreeObserver()来实现,想要取消监听可以通过移除方法实现

view.getViewTreeObserver().removeGlobalOnLayoutListener(this);

5.scrollview嵌套recyclerview显示不全

给recyclerview嵌套一个外布局LinearLayout或者RelativeLayout,设置属性

android:descendantFocusability="blocksDescendants"