0

I have two fragments and one activity (Main Activity). Now when I go from fragment 1 to fragment 2 data in fragment 2 loads from api. But when I press back button, navigates to fragment 1 and again I go from fragment 1 to fragment 2 then the previous loaded data is there for some secs and then fragment loads new data. Why it is so? I want that whenever I go to the fragment 2 it should reload again all the data (without showing the previous data for some secs first). Which method I should use?

Here is my onclick method from fragment 1 for navigating to fragment 2.

private void bind(FragmentUserInputFormBinding binding) {

        binding.btnFetchOffer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isAllFieldChecked = validateAllFields(binding);
                if (isAllFieldChecked) {
                    Bundle bundle = new Bundle();
                    bundle.putString("appid", binding.etAppId.getText().toString());
                    bundle.putString("uid", binding.etUserId.getText().toString());
                    bundle.putString("token", binding.etToken.getText().toString());
                    OfferWallListFragment offerWallListFragment = new OfferWallListFragment();
                    offerWallListFragment.setArguments(bundle);
                    requireActivity().getSupportFragmentManager().beginTransaction()
                            .replace(((ViewGroup) requireView().getParent()).getId(), offerWallListFragment,"offerListFragment")
                            .setReorderingAllowed(true)
                            .addToBackStack("offerListFragment")
                            .commit();
                }
            }
        });
       
    }

Now I have my second fragment designed as follows fragment 2.

@AndroidEntryPoint
public class OfferWallListFragment extends BaseFragment<FragmentOfferWallListBinding> {

    private RecyclerViewAdapter recyclerViewAdapter;
    private int currentPage = FIRST_PAGE;

    public OfferWallListFragment() {
        // Required empty public constructor
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Objects.requireNonNull(((AppCompatActivity) requireActivity()).getSupportActionBar()).setTitle("Offers List");
        initViewModel(FragmentOfferWallListBinding.bind(view));
    }

    @NonNull
    @Override
    protected FragmentOfferWallListBinding initBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
        return FragmentOfferWallListBinding.inflate(inflater, container, false);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_offer_wall_list, container, false);
    }

    private void initViewModel(FragmentOfferWallListBinding binding) {
        OfferWallViewModel offerWallViewModel = new ViewModelProvider(this).get(OfferWallViewModel.class);
        offerWallViewModel.getLiveData(currentPage).observe(getViewLifecycleOwner(), new Observer<OfferResponse>() {
            @Override
            public void onChanged(OfferResponse offerResponse) {
                if (offerResponse != null) {
                    recyclerViewAdapter = new RecyclerViewAdapter();
                    recyclerViewAdapter.setOfferResponse(offerResponse);
                    binding.rvOfferData.setHasFixedSize(true);
                    binding.rvOfferData.setLayoutManager(new LinearLayoutManager(getContext()));
                    binding.rvOfferData.setAdapter(recyclerViewAdapter);
                    binding.rvOfferData.setVisibility(View.VISIBLE);
                }

                RecyclerViewPaginator recyclerViewPaginator = new RecyclerViewPaginator(binding.rvOfferData) {
                    @Override
                    public boolean isLastPage() {
                        return currentPage == offerResponse.getPages();
                    }
                    @Override
                    public void loadMore(int _currentPage) {
                        currentPage = _currentPage;
                        offerWallViewModel.getLiveData(Math.toIntExact(_currentPage));
                    }
                };
                binding.rvOfferData.addOnScrollListener(recyclerViewPaginator);
            }
        });

        offerWallViewModel.getNetworkStateMutableLiveData().observe(getViewLifecycleOwner(), new Observer<NetworkState>() {
            @Override
            public void onChanged(NetworkState networkState) {
                if (networkState == NetworkState.Companion.getLOADING()) {
                    binding.pbLoadingItems.setVisibility(View.VISIBLE);
                } else if (networkState == NetworkState.Companion.getERROR()) {

                    Toast.makeText(getContext(), "Something went wrong, please check the parameters are filled perfectly", Toast.LENGTH_SHORT).show();
                    if (!CheckInternetConnection.isInternetAvailable(getContext())) {
                        Toast.makeText(getContext(), "No Internet Connection Available", Toast.LENGTH_SHORT).show();
                        binding.txtNoConnection.setText("No Internet Connection Available");
                        binding.txtNoConnection.setVisibility(View.VISIBLE);
                    }

                    binding.pbLoadingItems.setVisibility(View.GONE);
                } else {
                    binding.pbLoadingItems.setVisibility(View.GONE);
                }
            }
        });
    }
}

Also I have handled onBackPressed method from MainActivity as follows.

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView);
        if (navHostFragment != null) {
            NavController navController = navHostFragment.getNavController();
            AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                    R.id.userInputFormFragment, R.id.offerWallListFragment
            ).build();
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        }
    }

    @Override
    public void onBackPressed(){
        int count = getSupportFragmentManager().getBackStackEntryCount();
        if(count == 0) {
            super.onBackPressed();
        } else {
            getSupportFragmentManager().popBackStack();
        }
    }
}

Please have a look on it ?

Harry
  • 154
  • 4
  • 15

0 Answers0