0

I just try to recreate fragment in viewpager but I couldn't. I want to recreate previous fragment when I go back from current fragment to previous fragment.

For example, I have 12 months seperated in fragments. When I go to "March page", I could not see any changes in "February page" if I turn back "February page".

MonthPagerAdapter

public class MonthsPagerAdapter extends FragmentStatePagerAdapter {

private String [] tabTitles={"OCAK","SUBAT","MART","NISAN","MAYIS","HAZIRAN","TEMMUZ","AGUSTOS","EYLÜL","EKIM","KASIM","ARALIK","OCAK"};



public MonthsPagerAdapter(FragmentManager fm) {
    super(fm);

}

@Override
public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}

@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}

@Override
public Fragment getItem(int i) {
    switch (i) {
        case 0:
            return new PageMonth1Fragment();

        case 1:
            return new PageMonth2Fragment();

        case 2:
            return new PageMonth3Fragment();
        case 3:
            return new PageMonth4Fragment();

        case 4:
            return new PageMonth5Fragment();

        case 5:
            return new PageMonth6Fragment();

        case 6:
            return new PageMonth7Fragment();

        case 7:
            return new PageMonth8Fragment();

        case 8:
            return new PageMonth9Fragment();

        case 9:
            return new PageMonth10Fragment();

        case 10:
            return new PageMonth11Fragment();

        case 11:
            return new PageMonth12Fragment();

        case 12:
            return new PageMonth13Fragment();
        default:
                return null;


    }
}

@Override
public int getCount() {
    return 13;
}
}

DaysAdapter

public class DaysAdapter extends RecyclerView.Adapter<DaysAdapter.ViewHolder> {

private Context context;
private List<Integer> dayList;
private RecyclerView recyclerView;

View view;


private int i=0;
private int selectedMonth;
private int rezerStartDay,rezerfinishDay;

int startMonth,finishMonth;


public DaysAdapter(Context context, List<Integer> dayList, int selectedMonth,RecyclerView recyclerView) {
    this.context = context;
    this.dayList = dayList;
    this.recyclerView = recyclerView;
    this.selectedMonth = selectedMonth;

}

@NonNull
@Override
public DaysAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    view = LayoutInflater.from(context).inflate(R.layout.item_days, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder,  final int position) {

    this.holder=holder;

    holder.daysText.setText(String.valueOf(dayList.get(position)));

    startMonth= SelectedDateIntervalSingleton.getInstance().getSelectedStartMonth();
    finishMonth = SelectedDateIntervalSingleton.getInstance().getSelectedFinishMonth();

    Log.e("e","onBindViewHolder");


    final SelectedDateIntervalSingleton selectedDateIntervalSingleton=SelectedDateIntervalSingleton.getInstance();

    if(selectedMonth==startMonth&&selectedDateIntervalSingleton.getClickInterval()==3) {
        for(int j=selectedDateIntervalSingleton.getRezervationStartDay();j<=dayList.get(dayList.size()-1);j++)
            if(i==j){
                holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                holder.daysText.setTextColor(Color.parseColor("#ffffff"));



            }

    }

    holder.daysCardview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(startMonth==finishMonth){
                if(selectedDateIntervalSingleton.getClickInterval()==1){
                    selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                    holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                    holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                    rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                    selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                }else if(selectedDateIntervalSingleton.getClickInterval()==2){
                    rezerfinishDay=Integer.valueOf(holder.daysText.getText().toString());
                    if(rezerfinishDay>rezerStartDay){
                        for(int i=rezerStartDay;i<rezerfinishDay;i++){
                            ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                            holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                            holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                        }

                        selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                        Toast.makeText(context,"finishDay="+rezerfinishDay,Toast.LENGTH_LONG).show();
                        selectedDateIntervalSingleton.setRezervationFinishDay(rezerfinishDay);
                    }else {
                        ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(rezerStartDay-1);
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                        holder.daysText.setTextColor(Color.parseColor("#43425d"));
                        holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(position);
                        rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                        Toast.makeText(context,"2startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                        selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                        holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                        selectedDateIntervalSingleton.setClickInterval(2);
                    }
                }else if(selectedDateIntervalSingleton.getClickInterval()==3){
                    for (int i=rezerStartDay-1;i<rezerfinishDay;i++){
                        ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                        holder.daysText.setTextColor(Color.parseColor("#43425d"));

                    }
                    holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                    holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                    rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());

                    selectedDateIntervalSingleton.setClickInterval(2);

                    Toast.makeText(context,"3startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                    selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));


                }
                //start mont ve finish mont not equal
            }else{
                //selected month start montsa
                if(startMonth==selectedMonth){
                    if(selectedDateIntervalSingleton.getClickInterval()==1){
                        Toast.makeText(context,"1startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                        selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                        holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                        rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                        selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                        selectedDateIntervalSingleton.setMonthStartControl(true);
                    }
                    else if(selectedDateIntervalSingleton.getClickInterval()==2){
                        rezerfinishDay=Integer.valueOf(holder.daysText.getText().toString());
                        if(!selectedDateIntervalSingleton.isFinishMonthControl()){
                            if(rezerfinishDay>rezerStartDay){
                                for(int i=rezerStartDay;i<rezerfinishDay;i++){
                                    ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                                    holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                                    holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                                    Log.e("e",holder.daysText.getText().toString());
                                }
                                selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                                Toast.makeText(context,"finishDay="+rezerfinishDay,Toast.LENGTH_LONG).show();
                                selectedDateIntervalSingleton.setRezervationFinishDay(rezerfinishDay);
                            }else {
                                ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(rezerStartDay-1);
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                                holder.daysText.setTextColor(Color.parseColor("#43425d"));
                                holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(position);
                                rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                                Toast.makeText(context,"start month 2startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                                selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                                holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                                selectedDateIntervalSingleton.setClickInterval(2);
                            }
                        }else {

                            rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                            Toast.makeText(context,"2startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                            selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                            holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                            holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                            selectedDateIntervalSingleton.setClickInterval(2);
                            selectedDateIntervalSingleton.setFinishMonthClear(true);
                        }

                    }else if(selectedDateIntervalSingleton.getClickInterval()==3){
                        for (int i=rezerStartDay-1;i<rezerfinishDay;i++){
                            ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                            holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                            holder.daysText.setTextColor(Color.parseColor("#43425d"));

                        }
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                        holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                        rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                        selectedDateIntervalSingleton.setClickInterval(2);

                        Toast.makeText(context,"3startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                        selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));

                    }
                    //selected month finish montsa
                }else if(finishMonth==selectedMonth){
                    if(selectedDateIntervalSingleton.getClickInterval()==1){
                        Toast.makeText(context,"finish month startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                        selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                        holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                        rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                        selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                        selectedDateIntervalSingleton.setFinishMonthControl(true);
                    }else if(selectedDateIntervalSingleton.getClickInterval()==2){
                        rezerfinishDay=Integer.valueOf(holder.daysText.getText().toString());
                        if(!selectedDateIntervalSingleton.isMonthStartControl()){
                            if(rezerfinishDay>rezerStartDay){
                                for(int i=rezerStartDay;i<rezerfinishDay;i++){
                                    ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                                    holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                                    holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                                }
                                selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                                Toast.makeText(context,"finish month finishDay="+rezerfinishDay,Toast.LENGTH_LONG).show();
                                selectedDateIntervalSingleton.setRezervationFinishDay(rezerfinishDay);
                            }else {
                                ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(rezerStartDay-1);
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                                holder.daysText.setTextColor(Color.parseColor("#43425d"));
                                holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(position);
                                rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                                Toast.makeText(context,"2startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                                selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                                holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                                selectedDateIntervalSingleton.setClickInterval(2);
                            }
                        }else {
                            for(int i=0;i<rezerfinishDay;i++){
                                ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                                holder.daysText.setTextColor(Color.parseColor("#ffffff"));

                            }
                            selectedDateIntervalSingleton.setClickInterval(selectedDateIntervalSingleton.getClickInterval()+1);
                            Toast.makeText(context,"finish month finishDay="+rezerfinishDay,Toast.LENGTH_LONG).show();
                            selectedDateIntervalSingleton.setRezervationFinishDay(rezerfinishDay);
                            selectedDateIntervalSingleton.setFinishMonthCompleteControl(true);
                        }
                        selectedDateIntervalSingleton.setFinishMonthControl(true);

                    }else if(selectedDateIntervalSingleton.getClickInterval()==3){
                        if(!selectedDateIntervalSingleton.isMonthStartControl()){
                            for (int i=rezerStartDay-1;i<rezerfinishDay;i++){
                                ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                                holder.daysText.setTextColor(Color.parseColor("#43425d"));

                            }


                        }else {
                            for (int i=0;i<rezerfinishDay;i++){
                                ViewHolder holder= (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                                holder.daysCardview.setBackgroundColor(Color.parseColor("#ffffff"));
                                holder.daysText.setTextColor(Color.parseColor("#43425d"));

                            }

                        }
                        holder.daysCardview.setBackgroundColor(Color.parseColor("#5d87d9"));
                        holder.daysText.setTextColor(Color.parseColor("#ffffff"));
                        rezerStartDay=Integer.valueOf(holder.daysText.getText().toString());
                        selectedDateIntervalSingleton.setClickInterval(2);
                        selectedDateIntervalSingleton.setMonthStartControl(false);
                        selectedDateIntervalSingleton.setFinishMonthControl(true);
                        Toast.makeText(context,"finish mont 3startDay="+holder.daysText.getText().toString(),Toast.LENGTH_LONG).show();
                        selectedDateIntervalSingleton.setRezervationStartDay(Integer.valueOf(holder.daysText.getText().toString()));
                    }
                }
            }
        }
    });
}




@Override
public int getItemCount() {
    return dayList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView daysText;
    ConstraintLayout daysCardview;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        daysText = itemView.findViewById(R.id.daysText);
        daysCardview = itemView.findViewById(R.id.daysCons);
        int startMonth = SelectedDateIntervalSingleton.getInstance().getSelectedStartMonth();
        int finishMonth = SelectedDateIntervalSingleton.getInstance().getSelectedFinishMonth();
        int startDay = SelectedDateIntervalSingleton.getInstance().getSelectedStartDay();
        int finishDay = SelectedDateIntervalSingleton.getInstance().getSelectedFinishDay();

        RentalRezervation rentalDetailRezervation= (RentalRezervation) context;
        int size=dayList.size();

        itemView.setClickable(false);
        itemView.setEnabled(false);
        daysText.setTextColor(Color.parseColor("#c8c8c8"));
        i++;
        if(startMonth ==selectedMonth&& !(finishMonth ==selectedMonth)){
            for (int j = startDay; j<=size; j++){
                if(i==j){
                    itemView.setClickable(true);
                    itemView.setEnabled(true);
                    daysText.setTextColor(Color.parseColor("#43425d"));
                }
            }
            rentalDetailRezervation.setTvStartYear();

        }else if(finishMonth ==selectedMonth&& !(startMonth ==selectedMonth)){
            for (int j = 1; j<= finishDay; j++){
                if(i==j){
                    itemView.setClickable(true);
                    itemView.setEnabled(true);
                    daysText.setTextColor(Color.parseColor("#43425d"));
                }
            }
            rentalDetailRezervation.setTvFinishYear();


        }else if(startMonth ==selectedMonth){
            for(int j = startDay; j<= finishDay; j++){
                if(i==j){
                    itemView.setClickable(true);
                    itemView.setEnabled(true);
                    daysText.setTextColor(Color.parseColor("#43425d"));
                }
            }
            rentalDetailRezervation.setTvStartYear();


        }
        Log.e("e","onCreateViewHolder" +
                "");


    }
}
}

enter image description here

Marzi Heidari
  • 2,660
  • 4
  • 25
  • 57
alicant
  • 63
  • 6
  • Possible duplicate of [How set ViewPager inside a Fragment](https://stackoverflow.com/questions/19073541/how-set-viewpager-inside-a-fragment) – Ali Khaki Oct 23 '18 at 10:26

3 Answers3

2

You can add

viewPager.setOffscreenPageLimit(12);

to your viewpager.So it would never destroy any of your fagments. And Edit your adaptor such that you do not create new fragments every time:

    private String [] tabTitles=

{"OCAK","SUBAT","MART","NISAN","MAYIS","HAZIRAN",
"TEMMUZ","AGUSTOS","EYLÜL","EKIM","KASIM","ARALIK","OCAK"};
        private ArrayList<fragment> fragments=new ArrayList();


        public MonthsPagerAdapter(FragmentManager fm) {
            super(fm);

        }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles[position];
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int i) {
        fragments.get(i);


        }
    }

  public addFragment(Fragment fragment){
         fragments.add(fragment);
  }
    @Override
    public int getCount() {
        return fragments.size();
    }

Before setting Adapter to viewpager, add fragments to it:

 monthsPagerAdapter.add( new PageMonth1Fragment());
 monthsPagerAdapter.add(new PageMonth2Fragment();
 monthsPagerAdapter.add( new PageMonth3Fragment());
 monthsPagerAdapter.add(new PageMonth4Fragment());
 monthsPagerAdapter.add(new  PageMonth5Fragment());
 monthsPagerAdapter.add(new PageMonth6Fragment());
 monthsPagerAdapter.add(new PageMonth7Fragment());
 monthsPagerAdapter.add( new PageMonth8Fragment());
 monthsPagerAdapter.add(new  PageMonth9Fragment());
 monthsPagerAdapter.add(new  PageMonth10Fragment());
 monthsPagerAdapter.add(new  PageMonth11Fragment());
 monthsPagerAdapter.add( new PageMonth12Fragment());
 monthsPagerAdapter.add( new PageMonth13Fragment());
Marzi Heidari
  • 2,660
  • 4
  • 25
  • 57
0

Whenever you are switching frgament, try to find the fragment by id or find fragment by tag ,if it exist in the memory then you dont need to create one ,

PageMonth1Fragment pageMonthFragment
if (findViewByTag(R.id.fragment1) != null) {
pageMonthFragment  = findViewById(R.id.fragment1);
}
// if the listing fragment is null then create new one
else{
  pageMonthFragment = new PageMonth1Fragment();
}

getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, firstFragment).commit();

or you can add it to the back stack as per your requirement.

One more thing when you are adding fragemnt to the frament manager supply a tag so you can find that fragment by tag.Like this :

getSupportFragmentManager().beginTransaction()
.add(pageMonthFragment,"pageMonthFragment");

Pass unique tag for every fragment you add in the transaction.

Ajay Chauhan
  • 1,471
  • 4
  • 17
  • 37
0

because the viewpager keeps 3 fragments in maximum stack you have 1 2 3 if on the second, then keeps 1 and 3 in stack otherwise creates new, as indicated there

getItem should not create new every time, you need to create an instance of the fragment when creating an adapter and then just return this instance and in general, having 13 fragments with identical lists is a bad idea)