popBackStackImmediate () возвращается на пустой экран - PullRequest
0 голосов
/ 19 мая 2018

Я работаю над созданием списка тренировок, который отображается с помощью RecycleViewer и заполняется с помощью RecycleViewer Adapter и ViewHolder.RecycleViewer содержится во фрагменте.

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

Мне удалось заменить фрагмент новым фрагментом для отображения списка упражнений, однако, когда я нажимаю кнопку «Назад», отображается пустой экран.Я не уверен, что вызывает такое поведение.В идеале, при нажатии кнопки назад, WorkoutsListFragment будет отображаться снова.

Можете ли вы помочь мне понять и решить эту проблему, пожалуйста?

В моей WorkoutsActivity у меня есть это:

public class WorkoutsActivity extends AppCompatActivity implements WorkoutsListFragment.onWorkoutSelectedInterface {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_workouts);

    WorkoutsListFragment workoutsListFragment = new WorkoutsListFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager
            .beginTransaction()
            .add(R.id.workouts_fragment_container, workoutsListFragment)
            .commit();
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    getSupportFragmentManager().popBackStackImmediate();
}

@Override
public void onWorkoutSelected(int workoutId) {
    Log.i("****","workout : " + workoutId);
    ViewWorkoutFragment viewWorkoutFragment = new ViewWorkoutFragment();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.workouts_fragment_container, viewWorkoutFragment)
            .addToBackStack(null)
            .commit();
}
}

Для краткости, в WorkoutsListFragment я создал onWorkoutSelectedInterface и присвоил его значение в функции onAttach, где я получаю родительскую активность.

Затем я настроил свой RecycleViewer в функции onCreateView.Я передаю onWorkoutSelectedInterface адаптеру, из которого я передаю тот же интерфейс ViewHolder.

Держатель My View выглядит следующим образом:

 WorkoutListViewHolder(View card, WorkoutsListFragment.onWorkoutSelectedInterface onWorkoutSelectedInterface) {
    super(card);
    this.title = card.findViewById(R.id.workout_card_title);
    this.subTitle = card.findViewById(R.id.workout_card_sub_title);
    this.icon = card.findViewById(R.id.icon);
    this.workoutId = 0;

    card.setOnClickListener((View v) -> {
        Log.i("view", ""+ this.workoutId);
        onWorkoutSelectedInterface.onWorkoutSelected(9);
    });
}

Полный код можно найти на GitHub: https://github.com/michalorestes/getFitApp/tree/master/app/src/main/java/com/jds/fitnessjunkiess/getfitapp/Activities/WorkoutsActivity

Заранее благодарим за просмотр этого:)

ОБНОВЛЕНИЕ:

Я думаю, что все ближе к пониманию этой проблемы.Как бы странно это ни звучало, this.dataSet.clear () удаляет все данные в свойстве (как и ожидалось) и в аргументе (неожиданно!).Поэтому при запуске this.dataSet = dataSet;представления не отображаются, потому что нет данных для отображения.Похоже, обе переменные указывают на одну и ту же область памяти: /

 public void swapData(List<Workout> dataSet){
    if (this.dataSet != null) {
        this.dataSet.clear();
        this.dataSet.addAll(dataSet);
    }
    else {
        this.dataSet = dataSet;
    }

    notifyDataSetChanged();
}

1 Ответ

0 голосов
/ 19 мая 2018

Я решил эту проблему, изменив мою функцию подкачки на:

    public void swapData(List<Workout> data){
    this.dataSet = data;
    notifyDataSetChanged();
}
...