Android --- RecycleView

RecyclerView是官方在5.0之后新添加的控件,推出用来替代传统的ListViewGridView列表控件。

使用 RecyclerView 步骤

在布局文件中定义的一个 RecyclerView 实例,用作视图的容器。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyRecycleView">

    <TextView
        android:id="@+id/textView7"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="RecycleView"
        android:textAlignment="center"
        android:textColor="@color/design_default_color_primary_dark"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="@+id/recycleView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycleView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView7"
        app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>

布局管理器

布局管理器负责处理视图中界面组件的组织(布局)

RecyclerView提供了三种布局管理器即:

  • LinearLayoutManager 线性布局管理器
  • StaggeredGridLayoutManager 瀑布流布局管理器
  • GridLayoutManager 网格布局管理器

都是通过setLayoutManager方法来设置

public class MyRecycleView extends AppCompatActivity {

    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_recycle_view);
        // 设置布局
        LinearLayout linearLayout = new LinearLayout(this);
        recyclerView = findViewById(R.id.recycleView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
      
    }
}

准备数据项item的布局

如果所有列表项看起来都一样,您可以对所有这些列表项使用相同的布局,但这不是强制性要求。项布局必须与 fragment 的布局分开创建,以便一次创建一个项视图,并在其中填充数据。

recycle_view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 创建item布局-->
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    app:cardCornerRadius="20dp"
    app:cardElevation="3dp">

    <LinearLayout
        android:id="@+id/linearLayout1111"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/black"
        android:orientation="vertical">

        <TextView
            android:id="@+id/hourTxt"
            android:textColor="@color/white"
            android:textSize="14sp"
            android:textAlignment="center"
            android:layout_margin="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <TextView
            android:id="@+id/tempTxt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="20"
            android:textSize="18sp"
            android:textColor="@color/white"
            android:textAlignment="center"/>
    </LinearLayout>
</androidx.cardview.widget.CardView>
  • 准备显示的数据。

    int[] colors = {R.color.p1, R.color.p2, R.color.p3, R.color.p4, R.color.p5, R.color.p6};

适配器

该适配器可将您的数据与 RecyclerView 相关联。它会调整数据,使其可在 ViewHolder 中显示。RecyclerView 会使用适配器确定如何在屏幕上显示数据。

新建一个类继承 RecyclerView.Adapter<VH>的Adapter类(VH是ViewHolder的类名) ---- MyRecycleViewAdapter

创建ViewHolder:在Adapter中创建一个继承RecyclerView.ViewHolder的静态内部类,记为VH。ViewHolder的实现和ListView的ViewHolder实现几乎一样(为了减少每一个item布局找控件的时间)

在 Adapter中实现3个方法:

onCreateViewHolder() 为每个Item inflate出一个View,View直接封装在ViewHolder中,每一个item布局里的控件就在ViewHolder中找到

onBindViewHolder() 这个方法主要用于适配渲染数据到View中->item View中

getItemCount() 获取item长度

package com.example.androidstudiostudy;

import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

// 创建 RecyclerView适配器
/* 1. 新建一个类继承 RecyclerView.Adapter<VH>的Adapter类(VH是ViewHolder的类名) ---- MyRecycleViewAdapter
 * 2. 创建ViewHolder:在Adapter中创建一个继承RecyclerView.ViewHolder的静态内部类,记为VH。ViewHolder的实现和ListView的ViewHolder实现几乎一样(为了减少每一个item布局找控件的时间)
 * 3. 在 Adapter中实现3个方法:
 *    onCreateViewHolder() 为每个Item inflater出一个View,View直接封装在ViewHolder中,每一个item布局里的控件就在ViewHolder中找到
 *    onBindViewHolder() 这个方法主要用于适配渲染数据到View中->item View中
 *    getItemCount() 获取item长度
 * 可以看出,RecyclerView将ListView中getView()的功能拆分成了onCreateViewHolder()和onBindViewHolder()。*/


public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.ViewHolder> {
    // 创建静态类 ViewHolder
    // 可以视为 onCreate 方法,在这里获取行布局中的所有控件
    public static class ViewHolder extends RecyclerView.ViewHolder{
        private Color color;
        private LinearLayout linearLayout;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            linearLayout = itemView.findViewById(R.id.linearLayout1111);
        }
    }

    private final int[] colors;
    // 构造函数 获取数据
    public MyRecycleViewAdapter(int[] colors) {
        this.colors = colors;
    }

    @NonNull
    @Override
    //膨胀布局 为每一行提供外观的地方
    public MyRecycleViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_view_itemt,parent,false);
        return new ViewHolder(view);
    }

    @Override
    // 将每一行的数据值和每一行的布局进行绑定
    public void onBindViewHolder(@NonNull MyRecycleViewAdapter.ViewHolder holder,int position) {
        holder.linearLayout.setBackgroundColor(colors[position]);
        holder.itemView.setOnClickListener(v -> System.out.print("点击了颜色:"));
    }

    @Override
    public int getItemCount() {
        return colors.length;
    }


}
相关推荐
SRC_BLUE_171 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
无尽的大道4 小时前
Android打包流程图
android
镭封6 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰4876 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛6 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
IAM四十二6 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer
奶茶喵喵叫7 小时前
Android开发中的隐藏控件技巧
android
Winston Wood8 小时前
Android中Activity启动的模式
android
众乐认证8 小时前
Android Auto 不再用于旧手机
android·google·智能手机·android auto
三杯温开水9 小时前
新的服务器Centos7.6 安卓基础的环境配置(新服务器可直接粘贴使用配置)
android·运维·服务器