转载请注明出处:http://write.blog.csdn.net/postedit/40425231

编写RecyclerView.ItemDecoration时,在onDraw方法中,Drawable的高度等于RecyclerView的高度减去RecyclerView的上下padding。

@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 < childCount;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);mDivider.draw(c);}}

但运行后的显示效果却和我的预期相差很大

可以看到,ItemDecoration高度竟然全屏了,然后检查xml布局文件:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.xmy.recylerviewdemo.MainActivity" ><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:padding="10.0dip"android:orientation="vertical" ><ImageView android:id="@+id/item_iv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:scaleType="center"android:src="@drawable/img"android:adjustViewBounds="true"/><TextViewandroid:id="@+id/item_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

xml布局文件中RecyclerView和Item的高度都设定的是wrap_content,那说好的自适应于item高度呢?查看Android文档,没发现有关RecyclerView高度相关说明,看来只能自己动手丰衣足食了。

根据Android-RecylerView初识里提到的,RecyclerView并不负责Item的显示工作,而Adapter负责的是数据仓库和Item的视图,所以最终把目标锁定到RecyclerView.LayoutManager上。于是尝试继承LinearLayoutManager,发现果然有onMeasure方法:

public void onMeasure(Recycler recycler, State state, int widthSpec,int heightSpec)

在onMeasure中可以获得RecyclerView.Recycler。Recycler负责管理Item视图的重复利用,所以我们可以通过Recycler获取一个Item视图的实例,然后像复写其他ViewGroup一样,使用measureChild获取子视图的高度后使用setMeasuredDimension设置RecyclerView同样的高度即可。

public class MyLayoutManager extends LinearLayoutManager {public MyLayoutManager(Context context) {super(context);// TODO Auto-generated constructor stub}@Overridepublic void onMeasure(Recycler recycler, State state, int widthSpec,int heightSpec) {View view = recycler.getViewForPosition(0);if(view != null){measureChild(view, widthSpec, heightSpec);int measuredWidth = MeasureSpec.getSize(widthSpec);int measuredHeight = view.getMeasuredHeight();setMeasuredDimension(measuredWidth, measuredHeight);}}
}

修改完之后的运行效果图:

最后奉上示例程序Github链接。

RecyclerView高度随Item自适应相关推荐

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

    编写RecyclerView.ItemDecoration时,在onDraw方法中,Drawable的高度等于RecyclerView的高度减去RecyclerView的上下padding. @Ove ...

  2. Android中当item数量超过一定大小RecyclerView高度固定

    Android中当item数量超过一定大小时,将RecyclerView高度固定 方法1 直接通过LayoutParams来设定相应高度 ViewGroup.LayoutParams lp = rv. ...

  3. Android 入门第四讲03-列表RecyclerView(RecyclerView使用步骤(详),RecyclerView指定一行item的数目+指定一行item的数量,并且设置列表方向)

    Android 入门第四讲03-列表RecyclerViewRecyclerView使用步骤(详),RecyclerView指定一行item的数目+指定一行item的数量,并且设置列表方向) 1.Re ...

  4. Android添加item动画,RecyclerView基础篇-Item添加动画

    Android_Banner.jpg 简介 本节中我们介绍下给RecyclerView中的Item添加动画. 添加的动画,分为,在打开列表时有Item的展示动画,当滑动的时候没有动画 和打开列表滑动时 ...

  5. extjs的panel怎么自适应高度_Ext Js自适应高度

    在利用ExtJs经常会遇到窗口放大样式改变,出现多个重复元素对象,面板不随着窗口变化等诸多问题,接下来我们就来一起看看这都是什么原因造成的. 我查询了一些资料,现在就来总结下.一共有三个方面我们先来看 ...

  6. 去掉RecyclerView的默认item动画

    去掉RecyclerView的默认item动画 https://blog.csdn.net/CSDN_LQR/article/details/54766560 虽说RecyclerView的默认ite ...

  7. python文本框随窗体变化_Javascript 文本框textarea高度随内容自适应增长收缩

    直接上代码: 方案一: 枫芸志 » 文本框textarea高度自适应增长/伸缩 晴枫制作 http://jb51.net [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行] 方案一在各浏 ...

  8. css设置元素 网页高度自适应,css高度自适应如何实现?css高度根据内容自适应的简单方法...

    在进行网页开发时,可能会遇到这样的情况,网页中的内容会超出你原先设置的高度或者宽度,这时就需要实现高度自适应或者宽度自适应,下面这篇文章将给大家来介绍关于css高度自适应. PS:css宽度自适应的介 ...

  9. RecyclerView实现多种item布局

    RecyclerView实现多种item布局 1.首先我们重写了getItemViewType这个方法,在这个方法中根据position对item对象做了一些判断, 2.具体为每种viewType引入 ...

最新文章

  1. SQL Server里Grouping Sets的威力
  2. Leetcode--149. 直线上最多的点数
  3. Android8.1 MTK平台 截屏功能分析
  4. Linux操作Oracle(8)——Oracle数据库迁移全纪录(1) — 表空间 用户 权限迁移
  5. 你的“数学潜意识”原来可以被唤醒
  6. 分布式存储引擎OceanBase,UpdateServer 实现机制——存储引擎
  7. 伟豪带你逛郑州商业技师学院⑨:电气工程系
  8. 系统规划与管理师——IT服务规划设计
  9. web前端数据可视化控件
  10. 句法分析(成分句法分析)(依存句法分析)
  11. 谷歌地图打不开怎么办?
  12. 手机网速正常电脑很慢_路由器WiFi速度正常,但电脑和手机上网速度慢怎么办?...
  13. 如何生成一个APP_ID
  14. 小米扫地机器人一直提示安装尘盒_忘记放回小米扫地机器人的尘盒 居然打开新彩蛋...
  15. Apollo搭建使用
  16. 软件智能:aaas系统中的数学程序与技术服务之1 序篇之 绪言
  17. VM 虚拟机网络配置
  18. 分享几个常用的地表温度数据集
  19. hdu5078 hdu5074 顺便写一写鞍山
  20. 中标麒麟卸载安装yum和python

热门文章

  1. HTML配合js制作弹框,弹出信息框展示后台内容
  2. 跟我一起做电脑控制云台视频摄像头V1
  3. Python恶搞代码
  4. 4款宝藏国产软件,装了就舍不得卸载,白嫖必备
  5. js 根据当前位置经纬度,获取一定距离内的经纬度的最大/小值
  6. nginx常用操作命令
  7. Qorvo® 超宽带助力全球各行各业返工复产
  8. threejs 三面体_three.js初探,立体几何入手(一)
  9. CH32f103与stm32f103兼容开发资料
  10. webdriver常用方法+鼠标键盘事件+浏览器高级操作