首页 > 解决方案 > 使用 FirestoreRecyclerAdapter 的 RecyclerView 未从不同手机/模拟器上的同一用户获取数据

问题描述

我正在构建一个应用程序来创建旅行并显示旅行信息,我有一个活动来显示用户创建的所有旅行,但问题是,我只能在我创建的手机/模拟器上看到旅行信息旅行,即使我在不​​同的手机/模拟器上使用同一用户登录并使用云 Firestore。

这是我的 TravelActivity 的代码(具有用户旅行的 recyclerView 的代码)

import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;

public class TravelsActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference travelRef = db.collection("travels");

    private TravelAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_travels);

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
        bottomNavigationView.setSelectedItemId(R.id.searchNav);
        bottomNavigationView.setOnNavigationItemSelectedListener(this);

        Toast.makeText(this, "Sim", Toast.LENGTH_SHORT).show();
        setUpRecyclerView();
    }

    private void setUpRecyclerView() {

        Query query = travelRef.orderBy("timestamp", Query.Direction.DESCENDING)
                .whereEqualTo("userID", FirebaseAuth.getInstance().getCurrentUser().getUid())
                .whereGreaterThanOrEqualTo("timestamp", System.currentTimeMillis());




        FirestoreRecyclerOptions<Travel> options = new FirestoreRecyclerOptions.Builder<Travel>()
                .setQuery(query, Travel.class).build();

        //Toast.makeText(this, "Options: "+options.toString().length() , Toast.LENGTH_SHORT).show();

        adapter = new TravelAdapter(options);

        RecyclerView recyclerView = findViewById(R.id.travels_recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                adapter.deleteItem(viewHolder.getAdapterPosition());
                adapter.notifyDataSetChanged();
            }
        }).attachToRecyclerView(recyclerView);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }

标签: javaandroidfirebaseandroid-recyclerviewgoogle-cloud-firestore

解决方案


将此作为社区 Wiki 发布,因为它基于 @AlexMamo 的评论。

问题是您没有为此查询创建索引,您可以通过遵循该文档或遵循Alex's Answer找到有关如何创建的说明。


推荐阅读