编写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链接。

转载于:https://www.cnblogs.com/dongdong230/p/4315630.html

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

  1. RecyclerView高度随Item自适应

    转载请注明出处:http://write.blog.csdn.net/postedit/40425231 编写RecyclerView.ItemDecoration时,在onDraw方法中,Drawa ...

  2. 【Android 界面效果9】9patch图片

    1.什么是"9妹"(9patch)? 它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片;  2.何为"*.9.png& ...

  3. 【Android 界面效果22】Android的Tab与TabHost

    Tab与TabHost 这就是Tab,而盛放Tab的容器就是TabHost 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了.一个Activity,对应了多个功能布局. ①新建一个Tab项 ...

  4. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系

    一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有V ...

  5. android 头像球_【Android 界面效果44】Android之圆头像实例

    在很多应用中,我们看到,个人主页里面的头像一般都是圆的,设计成圆的会使整个界 面布 局变的优雅漂亮.那么,怎么使头像变圆呢?有的人说可以在上面加一个中间为透明圆形的png图,用它来遮盖住头像不就行了嘛 ...

  6. 【Android 界面效果43】Android LayoutInflater的inflate方法中attachToRoot的作用

    我们在ListView的Adapter的getView方法里面经常会调用两个参数的inflate方法, mInflater.inflate(R.layout.adv_viewpager, null); ...

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

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

  8. Android开发_android界面效果全汇总

    (一)Activity页面切换的效果 先介绍下左右滑动切换Activity,对于复杂的手势原理一样,具体后述. 主要原理为监控触屏事件和手势事件,在触屏事件处理函数中调用手势事件处理函数,表示用户触屏 ...

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

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

最新文章

  1. CodeForces - 755C PolandBall and Forest (并查集)
  2. VS中添加命令行参数的方法
  3. echarts tooltip的formatter回调参数设置,两组参数情况
  4. 网站架构演变和知识体系
  5. 【poj题集整理】【存下来并不会看】
  6. 如何分割合并ISO文件
  7. button执行onclick函数_千万别再一直无脑使用ES6的箭头函数了,它虽然很有用但并不是万能的...
  8. python 自定义向量化(vectorized)操作函数
  9. java 动态报表 sql,报表SQL
  10. Windows开发签名工具(SignTool)下载
  11. 爱快支持服务器网卡嘛,虚拟机安装爱快软路由,跟我一起来测试,单网卡安装教程...
  12. 电脑自动同步服务器时间bat,用Internet时间服务器来同步本机系统时间的批处理...
  13. 【问题日记】windows11 找不到组策略问题解决
  14. 有码变高清!一秒还原马赛克
  15. 阿里云服务平台,分布式架构云平台解决方案
  16. Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法
  17. python制作词云图片的三个步骤_3分钟教你用python制作一个简单词云
  18. CodeForces-937D-Sleepy Game
  19. FA-PEG-SH 叶酸PEG巯基
  20. 【转载】遥感影响数据集整理

热门文章

  1. 使用OpenCV进行人脸检测(Viola-Jones人脸检测方法)
  2. 在Eclipse中配置Tomcat服务
  3. 求环形数组的最大子数组的和
  4. Rainbond最佳实践:Tomcat配置Redis实现Session共享
  5. 一个App完成入门篇(一)-从Hello world开始
  6. 初探swift语言的学习笔记五(线程)
  7. Sticker.js生成图片或者页面元素“速干贴”效果
  8. lpk.dll病毒的现象和手工处理
  9. opencv利用直方图判断人脸光照质量
  10. 《微信小程序:开发入门及案例详解》—— 3.4 小结