我在使用 Firestore 快照侦听器的 Activity 中有一个片段。当我第一次启动片段时,它工作正常。但是如果我导航到另一个片段并返回,我会得到一个空的快照。如何让它再次正确获取快照?
这是监听注册的查询:
private void setupRecyclerView() {
if (mealplanRecycler == null) {
mealplanRecycler = mealplanView.findViewById(R.id.mealplan_recycler);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mealplanContext);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mealplanRecycler.setHasFixedSize(true);
mealplanRecycler.setLayoutManager(linearLayoutManager);
}
getMealplans();
}
private void getMealplans() {
String userId = (bundle != null && bundle.containsKey("userId")) ? bundle.getString("userId") : "";
Query mealplanQuery = firebaseFirestore.collection("Meal_Plans").whereEqualTo("userId", userId).orderBy("timeOfCreation", Query.Direction.DESCENDING);
registration = mealplanQuery.addSnapshotListener((value, error) -> {
toolbarProgressbar.setVisibility(View.GONE);
mealplanArrayList = new ArrayList<>();
if (error == null && value != null) {
for (QueryDocumentSnapshot document : value) {
Mealplan mealplan = document.toObject(Mealplan.class);
Mealplan updatedmealplan = updateTime(mealplan);
mealplanArrayList.add(updatedmealplan);
if (mealplanArrayList.size() > 0) {
tvAddMealplan.setVisibility(View.GONE);
ivAddmealplan.setVisibility(View.GONE);
}
}
if (mealPlanAdapter != null) {
mealPlanAdapter.setItems(mealplanArrayList);
mealPlanAdapter.notifyDataSetChanged();
} else {
String planId = (bundle != null && bundle.containsKey("planId")) ? bundle.getString("planId") : "none";
mealPlanAdapter = new MealPlanAdapter(mealplanContext, mealplanArrayList, planId);
mealplanRecycler.setAdapter(mealPlanAdapter);
}
mealPlanAdapter.setEditMealplanListener(this::onButtonPressed);
} else {
Log.d(TAG, "error is not null: " + Objects.requireNonNull(error).getLocalizedMessage());
toolbarProgressbar.setVisibility(View.GONE);
tvAddMealplan.setVisibility(View.GONE);
}
});
}
这就是我在主活动中创建片段的方式:
MealplanFragment fragment = new MealplanFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right).replace(R.id.frame_container, fragment, null);
fragmentTransaction.commit();
答案 0 :(得分:0)
片段的 onCreateView 仅在创建片段视图时调用一次。从那时起,只有在视图被销毁并需要重新创建时才会再次调用它。这就是 Activity 的 onCreate 函数。
因此,当您在片段之间切换时,它不会被调用。 解决办法是把监听器注册码放在一个函数里,这个函数在切换片段时会被调用。
你可以试试onHiddenChanged函数:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
}
else {
}
}
或
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
} else {
}
}
上述内容在 API 级别 28 中已弃用。因此,您也可以尝试 setMenuVisibility:
@Override
public void setMenuVisibility(boolean isvisible) {
super.setMenuVisibility(isvisible);
if (isvisible){
Log.d("Viewpager", "fragment is visible ");
}else {
Log.d("Viewpager", "fragment is not visible ");
}
}