RecyclerView高度随Item自适应 GridLayoutManager和LinearLayoutManager都适用

ScrollView嵌套RecyclerView时,android:layout_height=”wrap_content”并不起作用,RecyclerView会填充剩余的整个屏幕空间,也就相当于android:layout_height=”match_parent”,通过重写GridLayoutManager或LinearLayoutManager 的onMeasure方法进行可重置RecyclerView的高度。

这里只给出GridLayoutManager的例子,LinearLayoutManager类似

a.设置LayoutManager

rvPhotos.setLayoutManager(new PhotoLayoutManage(this, 3));

b.RecyclerView的Adapter

Adapter中定义变量item中的height

private int itemHeight;
public int getItemHeight(){ return itemHeight;}

在Adapter的ViewHolder构造方法中设置item项显示后的高度

itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    itemHeight=convertView.getMeasuredHeight();
                    return true;
                }
            });

c.自定义GridLayoutManager重写onMeasure方法

public class PhotoLayoutManage extends GridLayoutManager{
        // RecyclerView高度随Item自适应
        public PhotoLayoutManage(Context context,int spanCount) {
            super(context,spanCount);
        }
        @Override
        public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, final int widthSpec,final int heightSpec) {
            try {
                 //不能使用   View view = recycler.getViewForPosition(0);
                 //measureChild(view, widthSpec, heightSpec);
                 // int measuredHeight  view.getMeasuredHeight();  这个高度不准确

                    if(adapter!=null&&adapter.getItemHeight()>0) {
                        int measuredWidth = View.MeasureSpec.getSize(widthSpec);
                        int measuredHeight = adapter.getItemHeight()+rvPhotos.getPaddingBottom()+rvPhotos.getPaddingTop();
                        int line = adapter.getItemCount() / getSpanCount();
                        if (adapter.getItemCount() % getSpanCount() > 0) line++;
                        setMeasuredDimension(measuredWidth, measuredHeight * line);
                    }else{
                        super.onMeasure(recycler,state,widthSpec,heightSpec);
                    }

            }catch (Exception e){
                super.onMeasure(recycler,state,widthSpec,heightSpec);
            }
        }
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 04:49:19

RecyclerView高度随Item自适应 GridLayoutManager和LinearLayoutManager都适用的相关文章

【Android 界面效果49】RecyclerView高度随Item自适应

编写RecyclerView.ItemDecoration时,在onDraw方法中,Drawable的高度等于RecyclerView的高度减去RecyclerView的上下padding. @Override public void onDraw(Canvas c, RecyclerView parent, State state) { int top = parent.getPaddingTop(); int bottom = parent.getHeight() - parent.getP

RecyclerView实现条目Item拖拽排序与滑动删除

RecyclerView实现条目Item拖拽排序与滑动删除 版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 效果演示 直播视频讲解:[http://pan.baidu.com/s/1miEOtwG1 推荐大家结合我直播的视频看效果更好. 本博客源码传送门. 需求和技术分析 RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮. RecyclerView Item滑动删除:

为RecyclerView的不同item项实现不同的布局(添加分类Header)

最近在做一个应用的时候,需要为GridLayoutManager添加头部header,然后自然而然就想到了用不同的itemType去加载不同的布局. 1.实现多item布局,用不同的itemType去加载不同的布局. 主要思路就是先定义好标识itemType的常量,然后重写getItemViewType()方法,根据不同的位置(position)返回不同的Type,接着在onCreateViewHolder()中根据参数viewType去判断该item项应该 inflate 哪个布局文件,并返回

RecyclerView常见问题解决方案,RecyclerView嵌套自动滚动,RecyclerView 高度设置wrap_content 无作用等问题

1,ScrollView或者RecyclerView1 嵌套RecyclerView2  进入页面自动跳转到recyclerView2上面页面会自动滚动 貌似是RecyclerView 自动获得了焦点两种解决办法一,recyclerview去除焦点recyclerview.setFocusableInTouchMode(false);recyclerview.requestFocus();二,在代码里面 让处于ScrollView或者RecyclerView1 顶端的某个控件获得焦点即可比如顶部

Textarea高度随内容自适应地增长,无滚动条

<HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>枫芸志 » 文本框textarea高度自适应增长/伸缩</TITLE> </HEAD> <BODY> <textarea id="txtContent" rows="5&q

jQuery实现textarea高度根据内容自适应

1 //jQuery实现textarea高度根据内容自适应 2 $.fn.extend({ 3 txtaAutoHeight: function () { 4 return this.each(function () { 5 var $this = $(this); 6 if (!$this.attr('initAttrH')) { 7 $this.attr('initAttrH', $this.outerHeight()); 8 } 9 setAutoHeight(this).on('inpu

RecyclerView嵌套RecyclerView点击Item时顶上去的解决方法

RecyclerView嵌套RecyclerView点击Item时顶上去的原因是焦点抢占的原因,解决方法解决方法:holder.binding.rvContact.isFocusableInTouchMode = false (kotlin语法哦)注意:要在代码里面每次触发时设置,在xml里面一次性设置是无效的. 原文地址:https://www.cnblogs.com/yongfengnice/p/11445731.html

RecyclerView 高度不能随着Item数量 自适应高度

在最近项目中遇到 ,在RecyclerView加载list数据时,高度无法自适应增长,看了很多博客,各种尝试,都没有解决这个问题,在某个博客中,讲到此解决方法,在此记录下. 即在RecyclerView 布局时用 RelativeLayout 包裹着,即: <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:backgr

Android Studio - 第四十三期 RecyclerView存在大量Item时,当滚到底部时快速滑到顶部

在使用RecyclerView展示图片或者其他信息时,往往需要展示很多的Item,当滚到底部时又想回到顶部,如果一点一点的向上划去比较麻烦,而且用户体验不好.因此添加一个快速回到顶部的按钮是很有必要的,并且刚开始的时候这个按钮是隐藏的,当滑动超过超过一屏的时候才会出现,在滑动的过程中也是不会出现的.很多类似的项目都会使用到,但是如何在快速回到顶部的过程中不出现卡顿,体现的很是流畅,这点很重要.下面是我根据网上的方法自己修改的一个可以快速回到顶部的类,在此做一下备注,以便日后查看: 1.FastS