我正在使用Firestore来存储“图表”的集合。我需要查询集合以获取具有登录用户ID的所有图表。我有一个FirebaseRecyclerAdapter,它显示了相应的图表(查询通过FirestoreRecyclerOptions传递)。
但是,我需要访问每个图表的文档密钥,而我无法弄清楚如何获取该信息。理想情况下,我想在从数据库中检索图表时将其设置为图表模型中的变量,但“地图”似乎没有提供将文档键映射到模型中的值的方法。如果无法做到这一点,那么另一种解决方案就像在BindViewHolder中检索它并将其存储在一个不可见的视图中以便稍后阅读。
在我的主要活动中,我有:
FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
.setQuery(mChartsQuery, Chart.class)
.build();
mAdapter = new ChartListAdapter(recyclerOptions, this.getActivity());
其中mChartsQuery获取具有特定用户ID的图表。
图表是这样创建的(用户在表单字段中输入了'nameString'):
Map<String, Object> newChart = new HashMap<>();
newChart.put("uid", userId);
newChart.put("name", nameString);
mDatabase.collection("charts")
.add(newChart)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {...});
我的ChartListAdapter类是:
public class ChartListAdapter
extends FirestoreRecyclerAdapter<Chart, ChartViewHolder> {
public ChartListAdapter(FirestoreRecyclerOptions recyclerOptions) {
super(recyclerOptions);
}
@Override
protected void onBindViewHolder(ChartViewHolder holder, int position, Chart model) {
// THIS IS WHERE I NEED THE DOCUMENT ID, SO I CAN
// PASS IT INTO THE INTENT AS EXTRA_CHART_KEY
// Set click listener for the chart
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), ChartViewActivity.class);
intent.putExtra(ChartViewActivity.EXTRA_CHART_KEY, chartKey);
startActivity(intent);
}
});
// Bind Chart to ViewHolder
holder.bindToChart(model);
}
@Override
public ChartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_chart, parent, false);
return new ChartViewHolder(view);
}
}
因此,我需要能够在onBindViewHolder中检索文档ID。我找到了一个说使用getSnapshots().get(position).getKey();
的解决方案
但是getSnapshots().get(position)
只是检索一个没有设置密钥的图表。
答案 0 :(得分:7)
找到解决方案......在onBindViewHolder中我正在使用
getSnapshots().get(position).getKey();
但应该是
getSnapshots().getSnapshot(position).getId();
正确的版本可以正常工作,并获取文档ID。
答案 1 :(得分:1)
实际上应该是这一行,您可以从logcat中登录并检查
getSnapshots().getSnapshot(position).getId();
Log.i("chartKey==", String.valueOf(getSnapshots().getSnapshot(position).getId();))
然后,如果需要,可以将其转换为字符串;
String chartKey= getSnapshots().getSnapshot(position).getId();
Log.i("chartKey==",chartKey )
答案 2 :(得分:0)
在firebaseui 5.0.0中,不存在“ getSnapshots()”。在onBindViewHolder中,您必须使用。.
getItem(position).getId()
答案 3 :(得分:0)
我正在使用com.firebaseui:firebase-ui-firestore:6.2.1
,但似乎getSnapshots()
仍可以访问,因此只需在onBindViewHolder
中使用它们即可
snapshots.getSnapshot(position).id
如下所示:
// Kotlin
override fun onBindViewHolder(holder: MyHolder, position: Int) {
// ...
holder.itemView.setOnClickListener {_ ->
// ...
snapshots.getSnapshot(position).id
}
}
Logcat输出:
2020-05-19 23:10:58.595 14607-14607/com.app I/TESTTT: EFaJlMVKCcOLB1PvtQVg => {}
2020-05-19 23:10:58.598 14607-14607/com.app I/TESTTT: XdnrhZiURgqwk2vvoJS9 => {}
2020-05-19 23:10:58.600 14607-14607/com.app I/TESTTT: sCPpsMVfYw285tFZ4neS => {}
2020-05-19 23:10:58.602 14607-14607/com.app I/TESTTT: AoQjstzjIKlFpvDxNxWS => {}
2020-05-19 23:11:04.745 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: EFaJlMVKCcOLB1PvtQVg
2020-05-19 23:11:13.963 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: XdnrhZiURgqwk2vvoJS9
2020-05-19 23:11:17.061 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: AoQjstzjIKlFpvDxNxWS
2020-05-19 23:11:19.245 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: sCPpsMVfYw285tFZ4neS