RecyclerView

温馨提示:本文最后更新于2025-11-18 16:50:12,某些文章具有时效性,若有错误或已失效,请在下方留言

RecyclerViewAndroid 中一个用于高效展示大量列表数据的强大控件,是 ListView 的升级版。它具有更好的性能、更灵活的布局管理方式,并且支持强大的扩展能力。

RecyclerView 会回收这些独立的元素。当某个 item 滚出屏幕时,RecyclerView 不会销毁它对应的视图;相反,RecyclerView 会复用该视图来展示新滚入屏幕的 item

创建步骤

1. Item 布局

一个 XML 布局文件,用于定义 RecyclerView单个列表项(item) 的界面布局。

2. RecyclerView

Activity 中创建 RecyclerView 并对其进行初始化。

3. 模型类

表示用于保存 RecyclerView 每个条目信息的数据结构。

4. 适配器类

包含所有与 RecyclerView 实现相关的方法(创建、绑定以及确定条目数量)。

5. ViewHolder

保存每个条目布局中视图的引用,用于优化视图查找效率。

代码示例

Item 布局

<?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="wrap_content">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginTop="16dp"
        android:layout_marginStart="16dp"
        android:background="@drawable/ic_launcher_background"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/title_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:textColor="@color/white"
        android:text="title"
        android:textSize="32sp"
        app:layout_constraintStart_toEndOf="@+id/image_view"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/description_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="Your description here"
        android:textColor="@color/white"
        android:textSize="16sp"
        app:layout_constraintStart_toEndOf="@+id/image_view"
        app:layout_constraintTop_toBottomOf="@+id/title_view" />
</androidx.constraintlayout.widget.ConstraintLayout>

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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#283330"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/header_image"
        android:layout_width="0dp"
        android:layout_height="230dp"
        android:src="@drawable/header"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="24dp"
        android:background="#283330"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/header_image" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity 中的代码

package com.stewednoodles.marketapp;

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements ItemClickListener {
    // 1. AdapterView
    RecyclerView mRecyclerView;

    // 2. Data source
    List<Item> mItems;

    // 3. Adapter
    ItemAdapter itemAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        // Adapterview
        mRecyclerView = findViewById(R.id.recycler_view);

        mItems = new ArrayList<>();
        mItems.add(new Item(R.drawable.fruit, "Fruits", "Fresh Fruits from the Garden."));
        mItems.add(new Item(R.drawable.beverage, "Beverages", "Beverages from the Bottle."));
        mItems.add(new Item(R.drawable.bread, "Bread", "Bread from the Bread Factory."));
        mItems.add(new Item(R.drawable.milk, "Milk", "Milk from the Milk Factory."));
        mItems.add(new Item(R.drawable.popcorn, "Popcorn", "Popcorn from the Popcorn Factory."));
        mItems.add(new Item(R.drawable.vegitables, "Vegitables", "Vegitables from the Vegitables Factory."));
        mItems.add(new Item(R.drawable.fruit, "Fruits", "Fresh Fruits from the Garden."));
        mItems.add(new Item(R.drawable.beverage, "Beverages", "Beverages from the Bottle."));
        mItems.add(new Item(R.drawable.bread, "Bread", "Bread from the Bread Factory."));
        mItems.add(new Item(R.drawable.milk, "Milk", "Milk from the Milk Factory."));
        mItems.add(new Item(R.drawable.popcorn, "Popcorn", "Popcorn from the Popcorn Factory."));
        mItems.add(new Item(R.drawable.vegitables, "Vegitables", "Vegitables from the Vegitables Factory."));

        // 设置 mRecyclerView 的线性布局
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);

        itemAdapter = new ItemAdapter(mItems);
        mRecyclerView.setAdapter(itemAdapter);

        itemAdapter.setClickListener(this);
    }

    @Override
    public void onClick(View v, int pos) {
        Toast.makeText(this, "You choose: " + mItems.get(pos).getItemName(), Toast.LENGTH_SHORT).show();
    }
}

接口代码

package com.stewednoodles.marketapp;

import android.view.View;

public interface ItemClickListener {
    void onClick(View v, int pos);
}

模型类

模型类的相关代码

package com.stewednoodles.marketapp;

public class Item {
    private int itemImg;
    private String itemName;
    private String itemDesc;

    public Item(int itemImg, String itemName, String itemDesc) {
        this.itemImg = itemImg;
        this.itemName = itemName;
        this.itemDesc = itemDesc;
    }

    public int getItemImg() {
        return itemImg;
    }

    public void setItemImg(int itemImg) {
        this.itemImg = itemImg;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getItemDesc() {
        return itemDesc;
    }

    public void setItemDesc(String itemDesc) {
        this.itemDesc = itemDesc;
    }
}

适配器类以及ViewHolder

适配器类以及ViewHolder的相关代码

package com.stewednoodles.marketapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

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

import java.util.List;

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemViewHolder> {
    private List<Item> mItems;

    public ItemClickListener mItemClickListener;

    public void setClickListener(ItemClickListener listener) {
        this.mItemClickListener = listener;
    }

    public ItemAdapter(List<Item> mItems) {
        this.mItems = mItems;
    }

    /**
     * 负责为items创建新的viewholder
     */
    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater
                .from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);
        return new ItemViewHolder(itemView);
    }

    /**
     * 将数据源中的数据绑定到viewholder中的views上
     */
    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        Item item = mItems.get(position);
        holder.itemImageView.setImageResource(item.getItemImg());
        holder.itemNameView.setText(item.getItemName());
        holder.itemDescView.setText(item.getItemDesc());
    }

    /**
     * 返回数据源的长度
     */
    @Override
    public int getItemCount() {
        return mItems.size();
    }

    /**
     * 提供你所使用视图类型的引用(自定义 ViewHolder)。
     */
    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        ImageView itemImageView;
        TextView itemNameView;
        TextView itemDescView;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            itemImageView = itemView.findViewById(R.id.image_view);
            itemNameView = itemView.findViewById(R.id.title_view);
            itemDescView = itemView.findViewById(R.id.description_view);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onClick(v, getAdapterPosition());
            }
        }
    }
}

运行效果

运行的效果图,如下所示

运行效果
运行效果
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容