记一个RecyclerView获取高度的问题

5,629 阅读1分钟

问题描述

项目主界面暂定为九宫格样式,为了便于以后修改,决定用 RecyclerView 来实现,遇到的问题是九宫格会占满界面中间的位置,但高度是未知的。九宫格要求横纵都是三等分,横向的三列很好办, RecyclerView 的 GridLayoutManager 自身就可以实现。纵向的三行因为高度不确定,所以在布局时直接为子项 item 赋予确定的高度是不可行的,初步想法是动态设置 item 的高度。

解决方案

在代码中动态的为 item 设置整个 RecyclerView 三分之一的高度,首先要获取 RecyclerView 的高度,但在 onCreat()方法中直接获取到的高度是 0 ,这里采用了网上提供的一种方法,获取 ViewTreeObserver 并注册 OnGlobalLayoutListener(当全局布局状态改变或者视图树中视图的可见性发生变化时会进行调用),在这个监听中我们就可以获取 RecyclerView 的高度了。代码如下:

        recyclerView = findViewById(R.id.rv_main);
        models = new ArrayList<>();
        adapter = new MainAdapter(R.layout.item_main, models);
        gridLayoutManager = new GridLayoutManager(this, 3);
        //要先为 RecyclerView 设置 adapter 和 LayoutManager,否则 RecyclerView 会跳过布局(skipping layout)
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(gridLayoutManager);
        viewTreeObserver = recyclerView.getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //移除监听,只用于布局初始化
                recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                //传入 RecyclerView 高度,并做一些 Adapter 的初始化工作
                initAdapter(recyclerView.getHeight());
            }
        });