如何在Firestore数据库中获取Android中的文档ID或名称以传递给另一个活动?

问题描述 投票:2回答:1

我正在使用FirestoreRecyclerAdapter

我能够获得每个模型和文档属性。但我想获得文档ID。

我尝试使用model. Autosuggestions,但没有文档ID或名称

我有以下DealsHolder类。这是在Kotlin。然而,所有类的其余部分都在java中。

package com.guidoapps.firestorerecycleradaptersample


import com.google.firebase.firestore.IgnoreExtraProperties

@IgnoreExtraProperties
data class DealsResponse(var title:String? = null,
                var price:String? = null,
                var dealPrice:String? = null,
                var image:String? = null,
                var description: String? = null)

我在onCreate()中初始化的以下函数

 private void getDealsList(){
        Query query = db.collection("deals").orderBy("dateTime", Query.Direction.DESCENDING);

        FirestoreRecyclerOptions<DealsResponse> response = new FirestoreRecyclerOptions.Builder<DealsResponse>()
                .setQuery(query, DealsResponse.class)
                .build();

        adapter = new FirestoreRecyclerAdapter<DealsResponse, MainActivity.DealsHolder>(response) {
            @Override
            public void onBindViewHolder(MainActivity.DealsHolder holder, int position, DealsResponse model) {
                progressBar.setVisibility(View.GONE);
                holder.textTitle.setText(model.getTitle());
                holder.textPrice.setText(model.getPrice());
                holder.textDesc.setText(model.getDescription());
                holder.textDealPrice.setText(model.getDealPrice());

                holder.textPrice.setPaintFlags(holder.textPrice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

                Glide.with(getApplicationContext())
                        .load(model.getImage())
                        .into(holder.imageView);

                holder.itemView.setOnClickListener(v -> {
                    Snackbar.make(DealsList, model.getTitle(), Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();

                });
            }

在holder.itemView onClickListener中,我想获取文档ID以便传递给另一个活动

然后是以下DealsHolder。

public class DealsHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.title)
    TextView textTitle;
    @BindView(R.id.thumbnail)
    ImageView imageView;
    @BindView(R.id.description)
    TextView textDesc;
    @BindView(R.id.price)
    TextView textPrice;
    @BindView(R.id.dealPrice)
    TextView textDealPrice;

    public DealsHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}
java android firebase google-cloud-firestore firebaseui
1个回答
13
投票

使用适配器的getSnapshots()方法:

@Override
public void onBindViewHolder(MainActivity.DealsHolder holder, int position, DealsResponse model) {
    // ...
    holder.itemView.setOnClickListener(v -> {
        DocumentSnapshot snapshot = getSnapshots().getSnapshot(holder.getAdapterPosition());
        snapshot.getId();
        // ...
    }); 
}

getId()方法返回文档的id,所以在collection/myDoc/someField中,myDoc将是id。

如果您知道下一个活动中的数据结构,则可以通过标准firestore.collection("foo").document("bar")方法重新创建具有该ID的引用。如果你正在寻找一般的解决方案,我使用getPath()一堆:

fun Bundle.putRef(ref: DocumentReference) = putString(REF_KEY, ref.path)

fun Bundle.getRef() = FirebaseFirestore.getInstance().document(getString(REF_KEY))

如果您想在模型中使用id,请使用自定义SnapshotParser

val options = FirestoreRecyclerOptions.Builder<DealsResponse>()
        .setQuery(query) {
            it.toObject(DealsResponse::class.java).apply { id = it.id }
        }
        .build()
© www.soinside.com 2019 - 2024. All rights reserved.