【问题标题】:How to force Firestore Recycler Adapter to load live data not from cache如何强制 Firestore Recycler Adapter 加载实时数据而不是从缓存中
【发布时间】:2020-03-03 17:45:10
【问题描述】:

我希望 firestore recyclerview 适配器仅从服务器而不是从缓存加载数据。 “如果设备离线,我希望适配器不显示任何内容。” 但我不知道如何做到这一点,我搜索了它。我发现的是在普通的 get(); 方法中执行此操作的方法仅用于检索特定数据,但我没有找到任何人来解释使用 firebase firestore 适配器执行此操作的方法。

这是我的 MainActivity 代码。

public class MainActivity extends AppCompatActivity {
    private FirebaseFirestore db;
    RecyclerView recyclerView;
    private FirestoreRecyclerviewAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        db=FirebaseFirestore.getInstance();

        //Query
        Query query = db.collection("collection");
        FirestoreRecyclerOptions<ItemClass> options=new FirestoreRecyclerOptions.Builder<ItemClass>()
                .setQuery(query, ItemClass.class)
                .build();

        recyclerView=findViewById(R.id.recycler);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);

        adapter = new FirestoreRecyclerviewAdapter( options, this );

        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(layoutManager);

    }

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

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

这是适配器类... Firestore 适配器

public class FirestoreRecyclerviewAdapter  extends FirestoreRecyclerAdapter<ItemClass, FirestoreRecyclerviewAdapter.MyViewHolder> {

    public FirestoreRecyclerviewAdapter (@NonNull FirestoreRecyclerOptions<ItemClass> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull ItemClass item) {
        //Binding code.

    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false));
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        //view components

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            //initializing item components
        }
    }
}

【问题讨论】:

    标签: android firebase android-recyclerview google-cloud-firestore firebaseui


    【解决方案1】:

    我能想到的最简单的方法是disabling disk persistence,你可以这样做:

    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
            .setPersistenceEnabled(false)
            .build();
    db.setFirestoreSettings(settings);
    

    【讨论】:

    • 嘿,噗。你不应该将false 传递给setPersistenceEnabled() 方法,以禁用磁盘持久性吗?
    • 好收获。谢谢亚历克斯。复制/粘贴/忘记修改。 :) 我现在更新了。
    • 谢谢先生,但我不想在我的所有数据库中阻止持久性。我想阻止特定 Firestore 引用的持久性,该引用将在它的选项查询中初始化为 firestore Recyclerview 适配器。因为这个rec​​yclerview会显示一些s
    • 因为这个 Recyclerview 会显示类似于飞机上的空置地方可以预订的东西。所以,我不想显示一个可能被保留的地方“这在服务器上已确认,但用户的设备还没有读取这个”
    • 在这种情况下我能想到的最好的方法是使用DocumentSnapshot.getMetadata().isFromCache()。如果此值为true,则数据来自本地缓存并且不保证与服务器保持同步,因此在这种情况下您不希望显示它。
    【解决方案2】:

    当设备没有互联网连接时不要加载/获取数据,通知用户他/她的设备离线,如果需要服务应该确保设备有互联网连接。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2012-12-16
      • 2022-01-11
      • 2011-05-14
      • 2019-06-03
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多