0

Ich habe Probleme mit meinem Recyclerview. Wenn das Telefon in den Querformatmodus geschaltet wird oder das Layout in der App umgeschaltet wird, werden die zuvor ausgewählten Kontrollkästchen nicht wiederhergestellt.RecyclerView Checkboxen verlieren an Wert, wenn Layout umgeschaltet

BEARBEITEN --------------------------------------------- ---

hier ist mein Recycler Adapter:

public MyRecyclerAdapter(Context context, ArrayList<Workout> workout) { 
    mContext = context; 
    this.workout = workout; 
} 
// INITIALIZE HOLDER 
@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.workout_item, null); 
    MyViewHolder holder = new MyViewHolder(view); 

    return holder; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    holder.exercise.setText(workout.get(position).getExercise()); 
    holder.percent.setText(workout.get(position).getPercent()); 
    holder.reps.setText(workout.get(position).getReps()); 
    holder.weight.setText(workout.get(position).getWeight()); 
    holder.check1.setOnCheckedChangeListener(null); 
    final Workout isCheck = workout.get(position); 
    holder.check1.setChecked(isCheck.isCheck1()); 


    holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      isCheck.setCheck1(isChecked); 
     } 
    }); 

} 

Dies ist, wo der Adapter in jedem Fragment Klasse gesetzt ist (dies ist in der onCreateView):

//RECYCLERVIEW 
RecyclerView rv = (RecyclerView) view.findViewById(R.id.mRecyclerWed); 
rv.setLayoutManager(new LinearLayoutManager(this.getActivity())); 
rv.setAdapter(new MyRecyclerAdapter(this.getActivity(), getWedWorkout())); 
return view; 
} 

Und hier ist, wo die Fragmente sind aufgebaut:

public class WorkoutDaysActivity extends BaseActivity{ 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workout_days); 
    mToolBar = activateToolbar(); 
    setUpNavigationDrawer(); 
    getSupportActionBar().setTitle("Workout"); 

    ViewPager vp = (ViewPager) findViewById(R.id.view_pager); 
    this.addPages(vp); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    tabLayout.setupWithViewPager(vp); 
    tabLayout.setOnTabSelectedListener(listener(vp)); 

} 

//ADD ALL PAGES 
private void addPages(ViewPager pager) { 
    MyFragPagerAdapter adapter = new MyFragPagerAdapter(getSupportFragmentManager()); 
    Intent intent = getIntent(); 
    String workout = intent.getStringExtra("workout"); 
    Bundle args = new Bundle(); 
    args.putString("workout", workout); 

    MondayFragment mondayFragment = new MondayFragment(); 
    mondayFragment.setArguments(args); 
    adapter.addPage(mondayFragment); 
    WedFragment wedFragment = new WedFragment(); 
    wedFragment.setArguments(args); 
    adapter.addPage(wedFragment); 
    FridayFragment fridayFragment = new FridayFragment(); 
    fridayFragment.setArguments(args); 
    adapter.addPage(fridayFragment); 
    pager.setAdapter(adapter); 
} 

Antwort

1

Das ist richtig, die Fragmente werden jedes Mal neu erstellt, wenn Sie es schließen und wieder öffnen, das Gleiche passiert, wenn sich die Ausrichtung ändert. Um deine Frage zu beantworten, ja! Es gibt einige Möglichkeiten, das zu lösen, ich würde SharedPraferences verwenden, um den Status des Kontrollkästchens zu speichern und es in diesem Zustand wiederherzustellen. Beispiel?

int firstSecondOrThird; //first page, second page or thrid page. 

    public MyRecyclerAdapter(Context context, ArrayList<Workout> workout, int thePosition) { 
     mContext = context; 
     this.workout = workout; 
     this.firstSecondOrThird = thePosition; 
    } 


    final SharedPreferences prefs; 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     holder.exercise.setText(workout.get(position).getExercise()); 
     //... 
     prefs = mContext.getSharedPreferences("ehehehe", Context.MODE_PRIVATE); 

     holder.check1.setChecked(prefs.getBoolean(firstSecondOrThird+"checkState"+position, false)); //restore the state of the CheckBox 
     isCheck.setCheck1(prefs.getBoolean(firstSecondOrThird+"checkState"+position, false)); //not sure what's this just copying from you ^^ 


     holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       isCheck.setCheck1(isChecked); 
       prefs.edit().putBoolean(firstSecondOrThird+"checkState"+position, isChecked).apply(); //save the CheckBox's state 
      } 
     }); 

    } 

Und initiieren es wie folgt aus:

RecyclerView rv = (RecyclerView) view.findViewById(R.id.mRecyclerWed); 
    rv.setLayoutManager(new LinearLayoutManager(this.getActivity())); 
    rv.setAdapter(new MyRecyclerAdapter(this.getActivity(), getWedWorkout(), 1)); //in your first page 

    RecyclerView rv = (RecyclerView) view.findViewById(R.id.mRecyclerWed); 
    rv.setLayoutManager(new LinearLayoutManager(this.getActivity())); 
    rv.setAdapter(new MyRecyclerAdapter(this.getActivity(), getWedWorkout(), 2)); //in your second page, and 3 or the third 
+0

Sicher, wenn Sie nichts dagegen haben – LBJ33

+0

Natürlich nicht ^^ –

+0

Ich bin froh, dass es funktioniert hat, brauchen Sie Hilfe mit Anyhting sonst? Ich bin gelangweilt –

1

Haben Sie versucht, zu das Fragment Instanz behalten?

Schauen Sie sich die Android Dev Referenz hier: https://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

Kontrolle, ob ein Fragment Instanz über Activity Neuschöpfung (wie aus einer Konfigurationsänderung) beibehalten wird. Dies kann nur mit Fragmenten verwendet werden, die nicht im Backstack sind. Wenn gesetzt, wird der Fragmentlebenszyklus etwas anders sein, wenn eine Aktivität neu erstellt wird

+0

Hab es noch nicht probiert, schau mal rein, danke – LBJ33