如何根据RecyclerView点击传递的位置从Firebase获取对应笔记详情
问题根因
- 你仅向详情页传递了列表条目位置,未传递对应笔记的唯一标识或内容数据,无法定位到Firebase中对应的笔记条目
- 详情页的Firebase监听逻辑遍历了所有笔记数据,最终只会把最后一条笔记内容赋值到控件上,完全没有匹配目标条目
修复方案(推荐直接传值,无需二次请求Firebase,性能更高)
第一步:修改CustomAdapter的点击跳转逻辑
原逻辑仅传position,改为直接传递当前点击条目的时间、笔记内容字段
@Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { Model currentNote = models.get(holder.getBindingAdapterPosition()); holder.time_text.setText(currentNote.getText()); holder.string_text.setText(currentNote.getNotes()); holder.constraintLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context.getApplicationContext(), NotesDetails.class); // 直接传递需要展示的字段,无需二次查库 intent.putExtra("noteContent", currentNote.getNotes()); intent.putExtra("noteTime", currentNote.getText()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); }
第二步:修改NotesDetails的取值逻辑
直接从Intent取传递过来的字段赋值给对应控件,删除冗余的Firebase遍历逻辑
public class NotesDetails extends AppCompatActivity { TextView textShow, timeShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notes_details); textShow = findViewById(R.id.notesShow); timeShow = findViewById(R.id.timeshow); Intent intent = getIntent(); // 取传递过来的内容 String content = intent.getStringExtra("noteContent"); String time = intent.getStringExtra("noteTime"); // 赋值给控件 textShow.setText(content); timeShow.setText(time); } }
如果你的需求是必须从Firebase实时拉取最新的笔记内容,需要额外给Model类加noteId字段存储Firebase生成的唯一key,跳转时传递noteId,详情页直接按id查询对应条目即可,无需遍历所有数据。
内容的提问来源于stack exchange,提问作者Sum
相关产品推荐
相关产品推荐

