温馨提示:本文最后更新于
2025-11-18 16:50:12,某些文章具有时效性,若有错误或已失效,请在下方留言。RecyclerView 是 Android 中一个用于高效展示大量列表数据的强大控件,是 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











暂无评论内容