在新版本中需求变更导致布局需要变化,RecyclerView外需要一层ScrollView来处理滑动。发布前夕发现在API 23 & 24上RecyclerView显示不完整。

  光速冷静下来,马上去stackoverflow翻了一下,有人说ScrollView加上 android:fillViewport="true" ,但是我加上并没有解决问题。后来在RecyclerView外面加了一层RelativeLayout,问题解决。如果你在API 23 & 24上也遇到这个问题,可以参考一下。

                                        










  1. import android.content.Context;  
  2. import android.support.v7.widget.LinearLayoutManager;  
  3. import android.support.v7.widget.RecyclerView;  
  4. import android.util.Log;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7.   
  8. /**  
  9.  * Created by k on 2016/8/13.  
  10.  */  
  11. public class FullyLinearLayoutManager extends LinearLayoutManager {  
  12.   
  13.     private static final String TAG = FullyLinearLayoutManager.class.getSimpleName();  
  14.   
  15.     public FullyLinearLayoutManager(Context context) {  
  16.         super(context);  
  17.     }  
  18.   
  19.     public FullyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {  
  20.         super(context, orientation, reverseLayout);  
  21.     }  
  22.   
  23.     private int[] mMeasuredDimension = new int[2];  
  24.   
  25.     @Override  
  26.     public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,  
  27.                           int widthSpec, int heightSpec) {  
  28.   
  29.         final int widthMode = View.MeasureSpec.getMode(widthSpec);  
  30.         final int heightMode = View.MeasureSpec.getMode(heightSpec);  
  31.         final int widthSize = View.MeasureSpec.getSize(widthSpec);  
  32.         final int heightSize = View.MeasureSpec.getSize(heightSpec);  
  33.   
  34.         Log.i(TAG, "onMeasure called. \nwidthMode " + widthMode  
  35.                 + " \nheightMode " + heightSpec  
  36.                 + " \nwidthSize " + widthSize  
  37.                 + " \nheightSize " + heightSize  
  38.                 + " \ngetItemCount() " + getItemCount());  
  39.   
  40.         int width = 0;  
  41.         int height = 0;  
  42.         for (int i = 0; i < getItemCount(); i++) {  
  43.             measureScrapChild(recycler, i,  
  44.                     View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),  
  45.                     View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),  
  46.                     mMeasuredDimension);  
  47.   
  48.             if (getOrientation() == HORIZONTAL) {  
  49.                 width = width + mMeasuredDimension[0];  
  50.                 if (i == 0) {  
  51.                     height = mMeasuredDimension[1];  
  52.                 }  
  53.             } else {  
  54.                 height = height + mMeasuredDimension[1];  
  55.                 if (i == 0) {  
  56.                     width = mMeasuredDimension[0];  
  57.                 }  
  58.             }  
  59.         }  
  60.         switch (widthMode) {  
  61.             case View.MeasureSpec.EXACTLY:  
  62.                 width = widthSize;  
  63.             case View.MeasureSpec.AT_MOST:  
  64.             case View.MeasureSpec.UNSPECIFIED:  
  65.         }  
  66.   
  67.         switch (heightMode) {  
  68.             case View.MeasureSpec.EXACTLY:  
  69.                 height = heightSize;  
  70.             case View.MeasureSpec.AT_MOST:  
  71.             case View.MeasureSpec.UNSPECIFIED:  
  72.         }  
  73.   
  74.         setMeasuredDimension(width, height);  
  75.     }  
  76.   
  77.     private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,  
  78.                                    int heightSpec, int[] measuredDimension) {  
  79.         try {  
  80.             View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException  
  81.   
  82.             if (view != null) {  
  83.                 RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();  
  84.   
  85.                 int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,  
  86.                         getPaddingLeft() + getPaddingRight(), p.width);  
  87.   
  88.                 int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,  
  89.                         getPaddingTop() + getPaddingBottom(), p.height);  
  90.   
  91.                 view.measure(childWidthSpec, childHeightSpec);  
  92.                 measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;  
  93.                 measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;  
  94.                 recycler.recycleView(view);  
  95.             }  
  96.         } catch (Exception e) {  
  97.             e.printStackTrace();  
  98.         } finally {  
  99.         }  
  100.     }  
  101. }  

然后在代码里添加如下:

[html]  view plain  copy
  1. FullyLinearLayoutManager linearLayoutManager = new FullyLinearLayoutManager(this);  
  2.         recyclerView.setNestedScrollingEnabled(false);  
  3.         //设置布局管理器  
  4.         recyclerView.setLayoutManager(linearLayoutManager);  


更多相关文章

  1. ConfigurationTest以及横竖屏切换及2.3与4.0Configuration的区别
  2. 关于Android(安卓)的导入android.support.v4包解决ContextCompat
  3. 用桌面做应用的背景
  4. android 保存Bitmap到本地图片
  5. Android的页面布局小结
  6. android 击缩略图查看大图
  7. Android(安卓)高级编程--Fragment理解与使用
  8. color用法大全--Android布局背景颜色设置
  9. AndroidGUI27:findViewById返回null的解决办法

随机推荐

  1. 带你从源代码详细分析View的绘制过程
  2. [基础知识]全面认识AndroidManifest.xml
  3. Android指定专用APN
  4. 【Android(安卓)学习记录】Fragment注入
  5. G1安装android软件方法 (实机运行)
  6. Android近期任务列表 Recent Applicatoin
  7. Android Studio 无设备打包与有设备打包
  8. Android(安卓)使用MediaPlayer播放网络音
  9. Linux 使用 Nexus3.x 为 Android 搭建私
  10. (4.1.21.4)Android Handler 异步消息处理机