Android RecycleView高度自适应

高度自适应

RecycleView的高度为wrap_content 并且item的高度也是wrap_content时 RecycleView的高度就不会根据内容自动设置

解决方法如下

import android.content.Context;
import android.graphics.Rect;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

public class MyLinearLayoutManager extends LinearLayoutManager {

    public MyLinearLayoutManager(Context context) {
        super(context);
    }

    public MyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public MyLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }


    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        super.onLayoutChildren(recycler, state);
        // 先把所有的View先从RecyclerView中detach掉,然后标记为"Scrap"状态,表示这些View处于可被重用状态(非显示中)。
        // 实际就是把View放到了Recycler中的一个集合中。
        detachAndScrapAttachedViews(recycler);
        calculateChildrenSite(recycler);
    }

    int totalHeight = 0;

    private void calculateChildrenSite(RecyclerView.Recycler recycler) {
        totalHeight = 0;
        for (int i = 0; i < getItemCount(); i++) {
            // 遍历Recycler中保存的View取出来
            View view = recycler.getViewForPosition(i);
            addView(view); // 因为刚刚进行了detach操作,所以现在可以重新添加
            measureChildWithMargins(view, 0, 0); // 通知测量view的margin值
            int width = getDecoratedMeasuredWidth(view); // 计算view实际大小,包括了ItemDecorator中设置的偏移量。
            int height = getDecoratedMeasuredHeight(view);

            Rect mTmpRect = new Rect();
            //调用这个方法能够调整ItemView的大小,以除去ItemDecorator。
            calculateItemDecorationsForChild(view, mTmpRect);

            // 调用这句我们指定了该View的显示区域,并将View显示上去,此时所有区域都用于显示View,
            //包括ItemDecorator设置的距离。
            layoutDecorated(view, 0, totalHeight, width, totalHeight + height);
            totalHeight += height;
        }
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安卓圈

资源的插件化

第一类是res目录下存放的可编译资源文件,编译时,系统会自动在R.java中生成资源文件的十六进制值

10520
来自专栏腾讯位置服务

产品动态 | 地点云发布、小程序插件更新、JS API GL优化、SDK升级

【产品动态·导读】 地点云全新发布 - 用自己的数据,建自己的地图 微信小程序插件 - 新增地图选点插件 JavaScript API GL连发3版 - 常用...

9020
来自专栏数据森麟

用Python实现跳一跳自动跳跃。

10930
来自专栏小卷毛进阶历程

Flutter学习--基础控件

在开始使用flutter之前,需要熟悉dart语法,然后就开始学flutter的基础控件了.

14270
来自专栏安卓圈

Android系统启动过程

  当电源按下时引导芯片代码聪预定义的地方(固化在ROM)开始执行。加载引导程序到BootLoader到RAM,然后执行

7220
来自专栏数据森麟

Python自动抢红包,从此再也不会错过微信红包了!

作者 | 上海小胖 来源 | Python专栏(ID:xpchuiit) 目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 ...

43230
来自专栏华章科技

为什么要扫描我的脸?谷歌收集面部数据,引爆隐私问题

谷歌最新的智能显示屏最近出了一项备受争议的新功能Face Match,它是在谷歌Nest Hub Max上推出的。Face Match使用智能显示屏的前置摄像头...

8710
来自专栏Android技术分享

走进Android架构,体会架构师的魅力(附架构师必备技术详解)

有关android架构方面的知识少之又少,而对与架构的理解有关架构的文章也都是智者见智仁者见仁。在我身边听到最多的话就是架构=What?、架构=框架、架构=设计...

19340
来自专栏安卓圈

解决插件化资源id冲突

第一步:aapt。为res目录下的资源生成R.java文件,同时为AndroidManifest.xml生成Manifest.java文件

16120
来自专栏数据森麟

朋友圈的一些高级玩法

大多数人每天都要刷朋友圈,但很多人可能觉得朋友圈只有三个主要功能:发图文、视频以及转发动态。其实,朋友圈还有不少新奇玩法,下面来说道说道。

10320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励