使用FirestoreRecyclerAdapter时如何获取Firestore文档ID?

时间:2018-05-04 19:30:50

标签: android firebase google-cloud-firestore recycler-adapter

我正在使用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)只是检索一个没有设置密钥的图表。

4 个答案:

答案 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