RecyclerView GridLayoutManager实现复杂的列数变化的布局

遇到复杂的不规则列(即有的行显示的列数多,有的行显示的列数少,并且每列显示的内容页不一样)。对于这种需求在RecyclerView出来之前的解决方案,要么就是ListView中嵌套GirdView,要么就直接使用ScrollView,勉强可以实现此效果,但是这两种实现都有非常大的缺陷,即都不能进行item的复用。

GridLayoutManager.SpanSizeLookup

可以使用GridLayoutManager结合GridLayoutManager.SpanSizeLookup的相关功能实现,创建GridLayoutManager时列数填写所有可能列数的最小公倍数。再结合Aadapter中的:

@Override
public int getItemViewType(int position) {
    return position == 0 ? 0 : type;
}

即可实现。实现的关键代码如下:

GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return position == 0 ? 2 : 1;  //此句代码设置对应position位置item的跨列数,第一行显示一列,其他行显示两列
    }
});
recyclerView.setLayoutManager(layoutManager);

GridLayoutManager设置某个item类型占据的列数

/**
 * 将RecyclerView网格布局中的某个item设置为独占一行、只占一列,只占两列等等
 * @param gridLayoutManager
 */
private void setSpanCount(GridLayoutManager gridLayoutManager) {
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            int type = getItemViewType(position);
            if (type == TYPE_NORMAL_ITEM) {
                return 1;  //只占一行中的一列
            } else {
                return gridLayoutManager.getSpanCount();  //独占一行
            }
        }
    });
}
上一篇 解决Android ViewPager不能响应onTouchListener的问题
下一篇 Android DialogFragment生命周期show->onCreateView
目录
文章列表
1 CentOS下PHP make报错PEAR package PHP_Archive not installed
CentOS下PHP make报错PEAR package PHP_Archive not installed
2
Spring Boot 集成 disconf-client
Spring Boot 集成 disconf-client
3
Android NDK基础7:C_typedef_联合体_枚举
Android NDK基础7:C_typedef_联合体_枚举
4
支付宝离线支付原理
支付宝离线支付原理
5
使用 CloudFormer 通过现有 AWS 资源创建 AWS CloudFormation 模板
使用 CloudFormer 通过现有 AWS 资源创建 AWS CloudFormation 模板
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。