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 ?