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

来源:本网整理

@Overridepublic void onDraw(Canvas c,RecyclerView parent,State state){int top=parent.getPaddingTop();int bottom=parent.getHeight()-parent.getPaddingBottom();int childCount=parent.getChildCount();for(int i=0;i;i+){View child=parent.getChildAt(i);RecyclerView.LayoutParams layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();int left=child.getRight()+layoutParams.rightMargin;int right=left+mDivider.getIntrinsicWidth();mDivider.setBounds(left,top,right,bottom);www.zgxue.com防采集请勿采集本网。

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

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

你获取到RecyclerView item的视图对象,直接调用getWidth()自然就获取到了它的宽度。

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

思路是:因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这

a.设置LayoutManager

你获取到RecyclerView item的视图对象, 直接调用getWidth()自然就获取到了它的宽度。

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

wrap_content 是适配它内部的数据高度,xml还没有加载数据,就看不见啊,运行了数据就显示了

b.RecyclerView的Adapter

在实际工作中,我们经常需要在程序里面用代码来控制一些组件的宽度和高度,以适应不同分辨率的屏幕。尽管有不同的Layout供我们使用,但很多时候需要通过用代码设定组件的大小,以达到良好的界面

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); } } } $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('

    ').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

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

    参考如下内容:xml布局文件中RecyclerView和Item的高度都设定的是wrap_content,那说好的自适应于item高度呢?查看Android文档,没发现有关RecyclerView高度相关说明,看来只能自己动手丰衣足食了。根据Android-RecylerView初识里提到的,RecyclerView并不负责Item的显示工作,而Adapter负责的是数据仓库和Item的视图,所以最终把目标锁定到RecyclerView.LayoutManager上。于是尝试继承LinearLayoutManager,发现果然有onMeasure方法:[java]view plain copypublic void onMeasure(Recycler recycler,State state,int widthSpec,int heightSpec)在onMeasure中可以获得RecyclerView.Recycler。Recycler负责管理Item视图的重复利用,所以我们可以通过Recycler获取一个Item视图的实例,然后像复写其他ViewGroup一样,使用measureChild获取子视图的高度后使用setMeasuredDimension设置RecyclerView同样的高度即可内容来自www.zgxue.com请勿采集。

免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
Copyright © 2017 www.zgxue.com All Rights Reserved