如何强制 Firestore Recycler Adapter 加载实时数据而不是从缓存中加载
How to force Firestore Recycler Adapter to load live data not from cache
我希望 firestore recyclerview 适配器仅从服务器而不是缓存加载数据。 "I want the adapter display nothing if the device is offline." 但是我不知道怎么弄,就找了找。我发现的是在正常 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();
}
这是适配器 class...
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
}
}
}
我能想到的最简单的方法是 disabling disk persistence,您可以使用:
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setPersistenceEnabled(false)
.build();
db.setFirestoreSettings(settings);
当设备没有互联网连接时不要load/fetch数据,通知用户his/her设备离线,如果需要该服务应确保设备有互联网连接。
我希望 firestore recyclerview 适配器仅从服务器而不是缓存加载数据。 "I want the adapter display nothing if the device is offline." 但是我不知道怎么弄,就找了找。我发现的是在正常 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();
}
这是适配器 class... 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
}
}
}
我能想到的最简单的方法是 disabling disk persistence,您可以使用:
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(false) .build(); db.setFirestoreSettings(settings);
当设备没有互联网连接时不要load/fetch数据,通知用户his/her设备离线,如果需要该服务应确保设备有互联网连接。