GridLayoutManager高度无法设置为WRAP_CONTENT(Vertical情况下)
来源:互联网 发布:四川禄宏微交易 知乎 编辑:程序博客网 时间:2024/05/21 09:49
RecyclerView相信大家都不会陌生,作为ListView的替代控件,为大家提供了很多方便,在使用的时候我们会发现一个setLayoutManager这样一个方法,他的参数可以是LinearLayoutManager,GridLayoutManager以及特别酷炫的StaggeredGridLayoutManager,至于区别呢,大家自己动手,今天主要记录一下GridLayoutManager这个类。
GridLayoutManager主要是实现GridView这样的效果的,用着用着你会发现一个坑,那就是这个家伙高度无法设置为Wrap_content,就是说无论有几个子View高度都是一样的(Vertical情况下),都是MATCH_PARENT,效果如下:
解决的方式是写个子类继承GridLayoutManager,如下:
使用上述的类之后呢,效果就是class WrappableGridLayoutManager extends GridLayoutManager { public WrappableGridLayoutManager(Context context, int spanCount) { super(context, spanCount); } private int[] mMeasuredDimension = new int[2]; @Override public boolean canScrollVertically() { return false; } @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 spanWidth = 0; int spanHeight = 0; int viewWidth = 0; int viewHeight = 0; int spanCount = getSpanCount(); for (int i = 0; i < getItemCount(); i++) { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); if(i%spanCount==0){ spanWidth=mMeasuredDimension[0]; spanHeight=mMeasuredDimension[1]; }else{ if(getOrientation()==VERTICAL){ spanWidth+=mMeasuredDimension[0]; spanHeight=Math.max(spanHeight,mMeasuredDimension[1]); }else{ spanWidth=Math.max(spanWidth,mMeasuredDimension[0]); spanHeight+=mMeasuredDimension[1]; } } if(i%spanCount==spanCount-1||i==getItemCount()-1){ if(getOrientation()==VERTICAL){ viewWidth=Math.max(viewWidth,spanWidth); viewHeight+=spanHeight; }else{ viewWidth+=spanWidth; viewHeight=Math.max(viewHeight,spanHeight); } } } int finalHeight; int finalWidth; switch (widthMode){ case View.MeasureSpec.EXACTLY: finalWidth=widthSize; break; case View.MeasureSpec.AT_MOST: finalWidth=Math.min(widthSize,viewWidth); break; case View.MeasureSpec.UNSPECIFIED: finalWidth=viewWidth; break; default: finalWidth=widthSize; break; } switch (heightMode){ case View.MeasureSpec.EXACTLY: finalHeight=heightSize; break; case View.MeasureSpec.AT_MOST: finalHeight=Math.min(heightSize,viewHeight); break; case View.MeasureSpec.UNSPECIFIED: finalHeight=viewHeight; break; default: finalHeight=heightSize; break; } setMeasuredDimension(finalWidth,finalHeight); } private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { View view = recycler.getViewForPosition(position); if (view != null) { RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, getPaddingLeft() + getPaddingRight(), p.width); int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, getPaddingTop() + getPaddingBottom(), p.height); view.measure(childWidthSpec, childHeightSpec); measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin; measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin; Rect decoratorRect=new Rect(); calculateItemDecorationsForChild(view,decoratorRect); measuredDimension[0]+=decoratorRect.left; measuredDimension[0]+=decoratorRect.right; measuredDimension[1]+=decoratorRect.top; measuredDimension[1]+=decoratorRect.bottom; recycler.recycleView(view); } } }
当然,我使用了addItemDecotation方法,这个就不多说了。打个广告http://stay4it.com/,大神带你飞,不喜勿喷。
0 0
- GridLayoutManager高度无法设置为WRAP_CONTENT(Vertical情况下)
- GridView 设置其高度属性为 wrap_content
- 【android】解决Viewpager设置高度为wrap_content无效的方法
- Android ImageView设置长度高度为wrap_content时高度根据图片比例自适应
- Android ImageView设置长度高度为wrap_content时高度根据图片比例自适应
- Android ImageView设置长度高度为wrap_content时高度根据图片比例自适应
- Android进阶UI之ImageView设置长度高度为wrap_content时高度根据图片比例自适应
- 解决ViewPager高度无法wrap_content问题
- Android 解决ViewPager设置高度为wrap_content无效的方法 MyViewPager
- 使用ViewPager,设置为wrap_content后没有效果,以及多个view高度不同时ViewPager高度自适应
- RecyclerView设置背景图片长宽一样(以GridLayoutManager为例)
- 【android】如何让GridView的高度为Wrap_content
- 一句话解决RecyclerView 高度设置wrap_content 无作用的bug
- SrollView嵌套Gridview,ListView高度设置wrap_content显示不全解决
- RecyclerView在GridLayoutManager情况下实现四周都有分割线的ItemDecoration
- ScrollView中嵌套的viewPager,viepager高度设置为wrap_content时内容不显示问题以及与scrollview冲突的解决方案
- GridView、listView的高度为Wrap_content,高度包裹内容使用Integer.MAX_VALUE >> 2的原因
- Android 让GridView的高度为Wrap_content根据内容自适应高度
- Android设计模式—策略模式
- 临时表空间概念
- java资源摘录
- 炸弹人游戏_暴力枚举
- Ntrip协议相关(客户端软件或代码)
- GridLayoutManager高度无法设置为WRAP_CONTENT(Vertical情况下)
- 一个支持8~16人的小型网络游戏的编写
- Android中 Bitmap和Drawable相互转换的方法
- ExecutorService中submit和execute的区别
- C++实验1
- 新萝卜家园GHOST WIN7系统32,64位官方版下载
- mongodb丢失数据的原因剖析
- leetcode:N-Queens II
- Android设计模式系列-单例模式