Как заново создать фрагмент в viewpager? - PullRequest
0 голосов
/ 23 октября 2018

Я просто пытаюсь воссоздать фрагмент в viewpager, но не смог.Я хочу воссоздать предыдущий фрагмент, когда я возвращаюсь от текущего фрагмента к предыдущему фрагменту.

Например, у меня 12 месяцев разделено на фрагменты.Когда я перехожу на «страницу марта», я не вижу никаких изменений в «странице февраля», если я возвращаюсь назад «страница февраля».

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

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Всякий раз, когда вы переключаете frgament, попробуйте найти фрагмент по id или найти фрагмент по тегу, если он существует в памяти, вам не нужно создавать его,

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 ();

или вы можете добавить его в задний стек в соответствии с вашими требованиями.

Еще одна вещь, когда выдобавив fragemnt в менеджер фрагментов, укажите тег, чтобы вы могли найти этот фрагмент по тегу. Например:

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

Передайте уникальный тег для каждого фрагмента, добавленного в транзакцию.

0 голосов
/ 15 ноября 2018

, поскольку видовой пейджер хранит 3 фрагмента в максимальном стеке, если у вас есть 1 2 3, если он находится на втором, то сохраняет 1 и 3 в стеке, в противном случае создается новое, как указано здесь

getItem не должен создавать новый каждый раз,вам нужно создать экземпляр фрагмента при создании адаптера, а затем просто вернуть этот экземпляр, и вообще, иметь 13 фрагментов с одинаковыми списками - плохая идея)

0 голосов
/ 23 октября 2018

Вы можете добавить

viewPager.setOffscreenPageLimit(12);

к вашему viewpager.So, это никогда не разрушит ни один из ваших фагментов.И отредактируйте свой адаптер так, чтобы вы не создавали новые фрагменты каждый раз:

    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();
    }

Перед установкой адаптера в пейджер добавьте в него фрагменты:

 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());
...