版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

对于Recyclerview自己的LinearLayoutManager和GridLayoutManager,在版本23.2.0之后的library库中已经解决了自适应的问题

关于RecyclerView 23.2.0新特性
这个版本给 LayoutManager API 添加了新的特性:自动测量(auto-measurement)!它允许 RecyclerView 根据内容控制高度。
这意味着我们可以实现之前无法实现的情景(比如给 RecyclerView 设置 WRAP_CONTENT 属性)
基于这个改变,请检查 item 视图在之前设置的属性(旧版的 RecyclerView 的 item 视图如果设置 MATCH_PARENT 属性,则会自动占满整个视图)

但是有个问题就是当列表项超过一个屏幕的时候,Recyclerview的高度就是起始位置到屏幕的底部的高度值

Demo中的FullyGridLayoutManager、FullyLinearLayoutManager、MyStaggeredGridLayoutManager,是在Frank-Zhu/AndroidRecyclerViewDemo基础上进行了优化,解决了上面说到的问题。

效果图

LinearLayoutManager                                                         GridLayoutManager                                            

RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】                RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】

FullyLinearLayoutManager                                                FullyGridLayoutManager                                   

RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】                RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】

代码分析

使用FullyGridLayoutManager、FullyLinearLayoutManager、MyStaggeredGridLayoutManager的话,需要注意以下两点:

1、布局文件中需要给RecyclerView添加一个父布局LinearLayout【绿色区域是ScrollView的写法,黄色区域是需要注意的】

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F4F4F4">

    <!-- 设置区域:可滑动 -->
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbarSize="2dp"
        android:scrollbarThumbVertical="@drawable/scrollbar"
        android:scrollbars="vertical"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="对于系统自己的LinearLayoutManager和GridLayoutManager,在版本23.2.0之后的library库中已经解决了自适应的问题;\n但是有个问题就是当列表项超过一个屏幕的时候,Recyclerview的高度就是起始位置到屏幕的底部的高度值。"
                android:layout_margin="8dp"/>

            <!-- 列表区域 -->
            <LinearLayout
                android:id="@+id/recycler_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <!-- RecyclerView列表 -->
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:cacheColorHint="#00000000"
                    android:divider="@null"
                    android:listSelector="#00000000"
                    android:scrollbars="none"
                    />
            </LinearLayout>

            <Button
                android:id="@+id/btn_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="添加一个item"
                android:layout_margin="8dp"/>
        </LinearLayout>
    </ScrollView>
</RelativeLayout>

2、在代码中需要执行LayoutManager的setRecyclerViewLayout()方法,将RecyclerView的父布局传值过去

RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】

使用步骤

一、项目组织结构图

RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】

RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

(1)在build.gradle中引用recyclerview【版本号和appcompat保持一致】

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.why.project.recyclerfullymanagerdemo"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    //RecyclerView
    compile "com.android.support:recyclerview-v7:27.1.1"
}

(2)在项目中实现Recyclerview基本数据展现

1、创建Bean类

package com.why.project.recyclerfullymanagerdemo.bean;

/**
 * Created by HaiyuKing
 * Used 列表项的bean类
 */

public class NewsBean {
    private String newsId;//id值
    private String newsTitle;//标题

    public String getNewsId() {
        return newsId;
    }

    public void setNewsId(String newsId) {
        this.newsId = newsId;
    }

    public String getNewsTitle() {
        return newsTitle;
    }

    public void setNewsTitle(String newsTitle) {
        this.newsTitle = newsTitle;
    }
}
NewsBean.java

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-27
  • 2021-12-07
  • 2021-12-31
  • 2021-12-05
  • 2021-12-05
  • 2022-02-11
猜你喜欢
  • 2021-12-11
  • 2021-08-30
  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2022-01-04
  • 2021-07-12
相关资源
相似解决方案