You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java(FireStore)中将数组元素逐个显示到RecyclerView

实现Firestore数组数据在RecyclerView中展示的步骤

1. 创建数据模型类

先定义对应exercicios数组元素的实体类Exercicio.java,匹配Firestore中文档里的字段:

public class Exercicio {
    private String nome;
    private int series;
    private int repeticoes;

    // 空参构造必须存在,Firestore序列化需要
    public Exercicio() {}

    public Exercicio(String nome, int series, int repeticoes) {
        this.nome = nome;
        this.series = series;
        this.repeticoes = repeticoes;
    }

    // Getter方法,供适配器调用获取数据
    public String getNome() { return nome; }
    public int getSeries() { return series; }
    public int getRepeticoes() { return repeticoes; }
}

2. 编写RecyclerView适配器

创建ExercicioAdapter.java,负责将Exercicio数据绑定到列表条目:

public class ExercicioAdapter extends RecyclerView.Adapter<ExercicioAdapter.ExercicioViewHolder> {
    private List<Exercicio> exercicioList;

    public ExercicioAdapter(List<Exercicio> exercicioList) {
        this.exercicioList = exercicioList;
    }

    @NonNull
    @Override
    public ExercicioViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 加载自定义条目布局(需提前创建item_exercicio.xml)
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_exercicio, parent, false);
        return new ExercicioViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ExercicioViewHolder holder, int position) {
        Exercicio exercicio = exercicioList.get(position);
        // 将数据绑定到条目控件
        holder.tvNome.setText(exercicio.getNome());
        holder.tvSeries.setText("组数:" + exercicio.getSeries());
        holder.tvRepeticoes.setText("次数:" + exercicio.getRepeticoes());
    }

    @Override
    public int getItemCount() {
        return exercicioList.size();
    }

    // ViewHolder类,缓存条目控件避免重复查找
    public static class ExercicioViewHolder extends RecyclerView.ViewHolder {
        TextView tvNome, tvSeries, tvRepeticoes;

        public ExercicioViewHolder(@NonNull View itemView) {
            super(itemView);
            tvNome = itemView.findViewById(R.id.tv_nome);
            tvSeries = itemView.findViewById(R.id.tv_series);
            tvRepeticoes = itemView.findViewById(R.id.tv_repeticoes);
        }
    }
}

对应的条目布局item_exercicio.xml示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_nome"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="8dp">

        <TextView
            android:id="@+id/tv_series"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="16dp"/>

        <TextView
            android:id="@+id/tv_repeticoes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

3. 从Firestore读取数据并绑定到RecyclerView

在Activity或Fragment中,查询Treino集合的目标文档,解析exercicios数组并初始化RecyclerView:

public class TreinoActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private ExercicioAdapter adapter;
    private FirebaseFirestore db;

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

        // 初始化Firestore实例
        db = FirebaseFirestore.getInstance();
        // 初始化RecyclerView并设置布局管理器
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 查询Treino集合中的目标文档(替换为你实际的文档ID)
        db.collection("Treino").document("treino1")
                .get()
                .addOnSuccessListener(documentSnapshot -> {
                    if (documentSnapshot.exists()) {
                        // 将Firestore文档中的数组转为List<Exercicio>
                        List<Exercicio> exercicioList = documentSnapshot.toObject(TreinoDoc.class).getExercicios();
                        // 初始化适配器并绑定到RecyclerView
                        adapter = new ExercicioAdapter(exercicioList);
                        recyclerView.setAdapter(adapter);
                    }
                })
                .addOnFailureListener(e -> {
                    // 处理数据加载失败的情况
                    Toast.makeText(TreinoActivity.this, "加载失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                });
    }

    // 辅助类,用于解析包含exercicios数组的Firestore文档
    private static class TreinoDoc {
        private List<Exercicio> exercicios;

        public List<Exercicio> getExercicios() {
            return exercicios;
        }
    }
}

注意事项

  • 确保项目已配置Firebase依赖(包括Firestore和RecyclerView)。
  • 替换代码中的文档ID(如treino1)为你实际的文档ID。
  • 检查Firestore权限规则,确保应用有权限读取Treino集合的文档。

内容的提问来源于stack exchange,提问作者Leonardo Christino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:52:42