当我再次打开片段时,快照侦听器返回空快照

时间:2021-01-09 23:04:52

标签: java android android-fragments

我在使用 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();

1 个答案:

答案 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 ");
    }
}