Как получить идентификатор документа Firestore при использовании FirestoreRecyclerAdapter? - PullRequest
0 голосов
/ 04 мая 2018

Я использую Firestore для хранения коллекции «диаграмм». Мне нужно запросить коллекцию, чтобы получить все графики с идентификатором вошедшего в систему пользователя. У меня есть FirebaseRecyclerAdapter, который показывает соответствующие диаграммы (запрос передается через FirestoreRecyclerOptions).

Однако мне нужен доступ к ключу документа для каждой диаграммы, и я не могу понять, как получить эту информацию. В идеале я хотел бы установить его в качестве переменной в модели диаграммы, как только диаграмма будет извлечена из базы данных, но «карта», по-видимому, не обеспечивает способ сопоставления ключа документа со значением в модели. , Если это невозможно сделать, то другим решением было бы что-то вроде извлечения его в BindViewHolder и сохранения его в невидимом представлении для последующего чтения.

В своей основной деятельности я имею:

FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
                .setQuery(mChartsQuery, Chart.class)
                .build();

        mAdapter = new ChartListAdapter(recyclerOptions, this.getActivity());

, где mChartsQuery получает диаграммы с определенным идентификатором пользователя.

Диаграмма создается следующим образом (пользователь ввел '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. Я нашел решение, которое говорит использовать getSnapshots().get(position).getKey(); но getSnapshots().get(position) просто получает диаграмму, в которой не установлен ключ.

Ответы [ 2 ]

0 голосов
/ 24 июля 2019

В firebaseui 5.0.0 «getSnapshots ()» отсутствует. В onBindViewHolder вы должны использовать ..

getItem(position).getId()
0 голосов
/ 04 мая 2018

Нашел решение ... В onBindViewHolder я использовал

getSnapshots().get(position).getKey();

но это должно было быть

getSnapshots().getSnapshot(position).getId();

Правильная версия работает нормально и получает идентификатор документа.

...