RecyclerView是官方在5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件。
- <?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提供了三种布局管理器即:
都是通过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));
-
- }
- }
如果所有列表项看起来都一样,您可以对所有这些列表项使用相同的布局,但这不是强制性要求。项布局必须与 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
创建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
的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
{ - // 创建静态类 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;
- }
-
-
- }