TabItems of tabLayout on the viewpager2 is not working properly when switching between the tabs

23 Views Asked by At

I am using a fragment name historyFragment that have a tabLayout and the viewPager2 . TabItems are daily , weekly , monthly and all are fragment , that will show the data from the roomDB according to the date selected from the historyFragment . So, when i select the historyFragment and the default tab i.e., at postion 0 is dialyFragment it working fine by changing the date from the historyFragment. but when i switch between the tabs and back to daily it shows the old data there not updating with the current date..donot know why ? if my logic would wrong then it would not load the correct data when tab is selected for first time , there might be some issue with tab changing or viewPager2 donot know much, why this is happening?

let me give you the code

HistoryFragment code


public class HistoryFragment extends Fragment {

    MaterialToolbar toolbar;
    TabLayout tabLayout;
    ViewPager2 viewPager2;
    TextView currDate;
    ImageView btnPrev, btnNext;
    Calendar calendar;
    DateChangeListener dateChangeListener;


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


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }

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

        toolbar = view.findViewById(R.id.materialToolbar);
        toolbar.setTitle("Transaction");
        tabLayout = view.findViewById(R.id.tabLayout);
        viewPager2 = view.findViewById(R.id.viewPager);
        btnNext = view.findViewById(R.id.ivNext);
        btnPrev = view.findViewById(R.id.btnPrev);
        currDate = view.findViewById(R.id.currDate);
        calendar = Calendar.getInstance();

        viewPagerAdapter adapter = new viewPagerAdapter(getChildFragmentManager(), getLifecycle());
        viewPager2.setAdapter(adapter);
        viewPager2.setOffscreenPageLimit(1);

        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {

            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                if (position == 0) {

                    updateDate();
                }
                else if (position == 1) {

                    updateWeek();
                }
                btnPrev.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (position==0){
                            calendar.add(Calendar.DATE, -1);
                            updateDate();
                           if (dateChangeListener != null) {
                               Log.d("dateChange","prev tak sahi "+calendar.getTime());
                                dateChangeListener.onDateChanged(calendar.getTime());
                            }  else {
                                Toast.makeText(getContext(), "dateChange is null", Toast.LENGTH_SHORT).show();
                            }
                        }
                        else if(position==1){
                            calendar.add(Calendar.DATE, -6);
                            Log.d("weekly", "pre click " + calendar.getTime());
                            updateWeek();
                            if(dateChangeListener !=null){
                                dateChangeListener.onDateChanged(calendar.getTime());
                            }else{
                                Toast.makeText(getContext(),"datechange is null",Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                });

                btnNext.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        if(position==0){
                            calendar.add(Calendar.DATE, 1);
                            updateDate();
                            if (dateChangeListener != null) {
                                Log.d("dateChange","next tak sahi "+calendar.getTime());
                                dateChangeListener.onDateChanged(calendar.getTime());
                            } else {
                                Toast.makeText(getContext(), "dateChange is null", Toast.LENGTH_SHORT).show();
                            }
                        }

                        else if (position==1){
                            calendar.add(Calendar.DATE, 6);
                            updateWeek();
                            if(dateChangeListener!=null){
                                dateChangeListener.onDateChanged(calendar.getTime());
                            }else{
                                Toast.makeText(getContext(), "DateChangeNullError 404", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                });
            }

        });

        TabLayoutMediator layoutMediator = new TabLayoutMediator(tabLayout, viewPager2, true, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                switch (position) {
                    case 0:
                        tab.setText("Daily");
                        break;
                    case 1:
                        Log.d("weekly", calendar.getTime() + "");
                        tab.setText("Weekly");
                        break;
                    case 2:
                        tab.setText("Monthly");
                        break;
                }
            }
        });
        layoutMediator.attach();
        return view;
    }

    public void updateDate() {
        Log.d("prevHistory", " update " + calendar.getTime() + " ");
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/YYYY");
        SimpleDateFormat amPm = new SimpleDateFormat("hh mm a");
        currDate.setText(dateFormat.format(calendar.getTime()));
    }

    public void updateWeek() {
        Calendar selectedDate = (Calendar) calendar.clone();
        Date sd = selectedDate.getTime();
        int day = selectedDate.get(Calendar.DAY_OF_WEEK) - 1;
        selectedDate.add(selectedDate.DATE, -day);
        Date firstDateOfWeek = selectedDate.getTime();

        selectedDate.add(selectedDate.DATE, 6);
        Date lastDateOfWeek = selectedDate.getTime();

        SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MMM");
        String formattedFirstDate = outputFormat.format(firstDateOfWeek);
        String formattedLastDate = outputFormat.format(lastDateOfWeek);
        String week = formattedFirstDate + " to " + formattedLastDate;
        currDate.setText(week);
        Log.d("weekly", sd.getTime() + " " + formattedFirstDate + " " + formattedLastDate);
    }

    public interface DateChangeListener {
        void onDateChanged(Date newDate);
    }

    public void setDateChangeListener(DateChangeListener listener) {
        Log.d("dateChange","setChange call ");
        this.dateChangeListener = listener;

    }



ViewPager2Adapter code

public class viewPagerAdapter extends FragmentStateAdapter {
    private ViewPager2 viewPager ;
    public viewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);

    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {

        Fragment fragment;
        switch (position){
            case 0:
                Log.d("create","creating daily ");
                fragment = DailyFragment.newInstance();
                break;
            case 1:
                fragment = new WeeklyFragment();
                break;
            case 2:
                fragment = new MonthlyFragment();
                break;
            default:
                return null;
        }
        return fragment;
    }

    @Override
    public int getItemCount() {
        return 3;
    }
}

DailyFragment code


public class DailyFragment extends Fragment implements HistoryFragment.DateChangeListener {


    RecyclerView rvDaily;
    private TransactionViewModel transactionViewModel;
    HistoryTransactionAdapter historyTransactionAdapter;
    Calendar calendar = Calendar.getInstance() ;

    public DailyFragment() {
        Log.d("daily","daily calling 1");
        // Required empty public constructor
    }

    public static Fragment newInstance(){
        Log.d("daily","daily calling 2 ");
        return new DailyFragment();
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_daily, container, false);
        rvDaily =  view.findViewById(R.id.rvDaily);



        transactionViewModel = new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())
                .create(TransactionViewModel.class);


        historyTransactionAdapter = new HistoryTransactionAdapter(getContext());
        rvDaily.setLayoutManager(new LinearLayoutManager(getContext()));
        rvDaily.setAdapter(historyTransactionAdapter);

        HistoryFragment historyFragment = (HistoryFragment) requireParentFragment();

        historyFragment.setDateChangeListener(new HistoryFragment.DateChangeListener() {
            @Override
            public void onDateChanged(Date newDate) {
                Log.d("prevHistory","on click "+newDate +" ");
                updateDate(newDate);
            }
        });
        updateDate(calendar.getTime());
        return view;
    }

    public void updateDate(Date currDate) {

        Log.d("datedc", currDate+ " frag");
        transactionViewModel.getTransactionsByDate(currDate).observe(getActivity(), new Observer<List<Transaction>>() {
            @Override
            public void onChanged(List<Transaction> transactions) {
                // update the RecyclerView
                Log.d("transHistory", "Size: " + transactions.size() + " " +currDate);
                historyTransactionAdapter.setTransactionList(transactions);
            }
        });


//        long mil = new Date().getTime();
//        Date date = new Date(mil);
//        SimpleDateFormat format = new SimpleDateFormat("dd MMM YYYY");
//        SimpleDateFormat format1 = new SimpleDateFormat("hh mm a", Locale.getDefault());
//        String d = format.format(date.getTime());
//        String time = format1.format(date.getTime());
//        Log.d("time22", "date " + d + " time " + time);
    }

    @Override
    public void onDateChanged(Date newDate) {
        updateDate(newDate);
    }


other tabItems are also same

offsetPager i try but didnot got any help ?

0

There are 0 best solutions below