项目中需要在scrollview里面嵌套一个水平滑动的列表视图,然后巴拉巴拉用RecyclerView写完,run项目后打开一看 RecyclerView视图没有显示出来,然后看网上出的一些主意
1、
在ScorrlView 里面加一行 android:fillViewport="true"
亲测还是不显示
2、 在RecyclerView外层嵌套<RelativeLayout>
测试后发现还是不显示,但是提供这个方法的人说他的加上后就没问题了,所以可以试下,万一成功了捏。
3、然后在一个国外大神的帖子中发现有人说 讲ScrollView改成NestedScrollView 并添加recyclerView.setNestedScrollingEnabled(false); 然后兴冲冲的去添加然后run项目 结果还是不行~
连接地址为http://stackoverflow.com/questions/27083091/recyclerview-inside-scrollview-is-not-working
但是这里面有个哥们提供的一个重写
LinearLayoutManager ,测试后是可以显示RecyclerView的VERTICAL状态下是可以显示的但是我的项目要求是HORIZONTAL状态~ 然后大神的改动太大嘞,看着有点晕。。
4、好吧自己搞吧,还是重写 RecyclerView 的LinearLayoutManager 然后在onMeasure方法中做好判断是 VERTICAL 还是 HORIZONTAL
然后就ok了,下面上代码
@Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { final int widthMode = View.MeasureSpec.getMode(widthSpec); final int heightMode = View.MeasureSpec.getMode(heightSpec); final int widthSize = View.MeasureSpec.getSize(widthSpec); final int heightSize = View.MeasureSpec.getSize(heightSpec); int width = 0; int height = 0; for (int i = 0; i < getItemCount(); i++) { if (getOrientation() == HORIZONTAL) { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), heightSpec, mMeasuredDimension); width = width + mMeasuredDimension[0]; if (i == 0) { height = mMeasuredDimension[1]; } } else { measureScrapChild(recycler, i, widthSpec, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); height = height + mMeasuredDimension[1]; if (i == 0) { width = mMeasuredDimension[0]; } } } switch (widthMode) { case View.MeasureSpec.EXACTLY: width = widthSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } switch (heightMode) { case View.MeasureSpec.EXACTLY: height = heightSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } setMeasuredDimension(width, height); }
但是我总觉得这个不是啥好方法。。。重复的去计算宽高如果数据量较大的话,感觉亚历山大啊