0
点赞
收藏
分享

微信扫一扫

android RecyclerView 加载10条数据 为什么会进10次onCreateViewHolder

深入理解 RecyclerView 的 onCreateViewHolder 方法

在 Android 开发中,RecyclerView 是用来显示大量数据的一个广泛使用的组件。许多初学者在实现 RecyclerView 时,可能会遇到一个问题:为什么在加载 10 条数据时,onCreateViewHolder 方法会被调用 10 次?本文将帮助你了解到这一过程的具体流程,并逐步分析每一步所涉及的代码。

整体流程

理解 RecyclerView 的工作原理是理解其生命周期关键的一步。接下来是 RecyclerView 的整体流程,将步骤以表格的形式展示:

步骤 说明
1 RecyclerView 初始化并设置适配器
2 AdapteronCreateViewHolder 方法被调用
3 创建 ViewHolder 实例
4 onBindViewHolder 方法被调用,将数据绑定到 ViewHolder
5 用户滚动时,ViewHolder 被重用

让我们逐步深入到每一步中。

每一步的代码实施

1. RecyclerView 初始化并设置适配器

首先,你需要在布局文件中添加 RecyclerView 组件,并在代码中进行初始化:

<!-- res/layout/activity_main.xml -->
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>

接着,在你的 Activity 或 Fragment 中,初始化 RecyclerView 并设置适配器:

// MainActivity.java
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private MyAdapter myAdapter; // 自定义适配器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化 RecyclerView
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 设置适配器并传入数据
        myAdapter = new MyAdapter();
        recyclerView.setAdapter(myAdapter);  // 这一步会使得适配器的相关方法被调用
    }
}

代码解释:

  • RecyclerView 实例化后,设置了线性布局管理器。
  • 通过设置适配器,进入了 onCreateViewHolderonBindViewHolder 方法。

2. Adapter 的 onCreateViewHolder 方法

在你的自定义适配器中,你需要重写 onCreateViewHolder 方法。在你加载数据时,将调用此方法来创建新的 ViewHolder 实例。

// MyAdapter.java
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    // 模拟的数据
    String[] data = new String[10];

    public MyAdapter() {
        for (int i = 0; i < data.length; i++) {
            data[i] = "Item " + (i + 1);
        }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 从布局中创建 ViewHolder
        View view = LayoutInflater.from(parent.getContext())
                .inflate(android.R.layout.simple_list_item_1, parent, false);
        return new ViewHolder(view);
    }
}

代码解释:

  • onCreateViewHolder 通过 LayoutInflater 将布局文件转化为 View 实例,并创建 ViewHolder

3. 创建 ViewHolder 实例

onCreateViewHolder 中创建 ViewHolder,并将 View 绑定到 ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView textView;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        textView = itemView.findViewById(android.R.id.text1); // 初始化 TextView
    }
}

代码解释:

  • ViewHolder 中的 TextView 用于显示数据。

4. onBindViewHolder 方法

使用 onBindViewHolder 将数据绑定到 ViewHolder

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    // 为 ViewHolder 绑定数据
    holder.textView.setText(data[position]);
}

代码解释:

  • onBindViewHolder 会被调用来更新 ViewHolder 中的内容。

5. 用户滚动时,ViewHolder 被重用

RecyclerView 会重用已存在的 ViewHolder,因此 onCreateViewHolder 不会被每次都调用,而是调用 onBindViewHolder 来更新数据。

序列图

接下来,用序列图说明整个流程:

sequenceDiagram
    participant User
    participant RecyclerView
    participant Adapter as MyAdapter
    participant ViewHolder
    User->>RecyclerView: 触发
    RecyclerView->>Adapter: getItemCount()
    Adapter->>RecyclerView: 返回10
    RecyclerView->>Adapter: onCreateViewHolder() *10次
    Adapter->>ViewHolder: 创建 ViewHolder
    RecyclerView->>Adapter: onBindViewHolder() *10次
    Adapter->>ViewHolder: 绑定数据

饼状图

在下图中,展示了 onCreateViewHolderonBindViewHolder 的调用比例。

pie
    title 调用比例
    "onCreateViewHolder方法": 10
    "onBindViewHolder方法": 10

结尾

通过本文的介绍,相信你已经能够清楚地理解 RecyclerView 的数据加载机制和其生生命周期。关键在于 RecyclerView 在加载数据时,会创建 ViewHolder 实例并通过 onBindViewHolder 进行数据绑定。但重要的是要记住,RecyclerView 会重用 ViewHolder,而不是为每个数据项创建新的实例。这样设计能够提升性能并节省内存。希望这篇文章能帮助你更好地理解和使用 RecyclerView

举报

相关推荐

0 条评论