如何在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
相关产品推荐
相关产品推荐

