После удаления элемента 1 в представлении recyclerview при нажатии на элемент 2 ничего не отображается (onClick открываеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 После удаления элемента 1 в представлении recyclerview при нажатии на элемент 2 ничего не отображается (onClick открывае

Сообщение Anonymous »


Итак, я пытаюсь создать приложение, в котором есть кнопка +, и при нажатии на нее отображается AlertDialog с текстом «Имя тренировки:» и EditText с подсказкой «Введите имя тренировки». При написании названия тренировки и нажатии положительной кнопки «Добавить» элемент добавляется в окно повторного использования. Для элементов в представлении recyclerview существует метод onClick, и при нажатии на «Тренировку» открывается аналогичная активность, но на этот раз при нажатии «+» вы добавляете упражнение, связанное с этой «Тренировкой». Я добавил несколько упражнений, а затем создал еще одну «тренировку» и добавил к ней разные упражнения. При удалении первой «тренировки» я хочу удалить только связанные с ней упражнения и не трогать вторую, к сожалению, когда я удаляю « Тренировка 1» также удаляет упражнения из «Тренировки 2». Я использую SharedPreferences для сохранения информации и пытался использовать HashMap для упражнений, сейчас второй день, и я действительно не могу найти ответ самостоятельно. Это код первого действия:

публичный класс FitNotes расширяет AppCompatActivity реализует WorkoutInterface { RecyclerView recyclerView; Кнопка btnAddWorkout; TextView txtViewInstructions; List WorkoutList; WorkoutAdapter recyclerViewAdapter; частная статическая окончательная строка WORKOUT_LIST_KEY = «workoutList»; частная картаупражненияMap; частная статическая конечная строка EXERCISES_MAP_KEY = "EXERCISES_MAP"; // Определить ключ для упражненийMap @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getSupportActionBar().hide(); setContentView(R.layout.activity_fit_notes); recyclerView = findViewById(R.id.recycler_workout); btnAddWorkout = findViewById(R.id.btnAddWorkout); txtViewInstructions = findViewById(R.id.txtViewInstructions); WorkList = новый ArrayList(); recyclerViewAdapter = новый WorkoutAdapter (это, WorkoutList, это); recyclerView.setAdapter(recyclerViewAdapter); recyclerView.setLayoutManager(новый LinearLayoutManager(this)); ItemTouchHelper itemTouchHelper = новый ItemTouchHelper (новый FitNotes.SwipeToDeleteCallback()); itemTouchHelper.attachToRecyclerView(recyclerView); updateInstructionsVisibility(); ЗагрузитьДанные(); загрузитьКартуУпражнений(); btnAddWorkout.setOnClickListener(новый View.OnClickListener() { @Override public void onClick (Просмотр) { showAddWorkoutDialog(); } }); } частный недействительный showAddWorkoutDialog () { AlertDialog.Builder builder = новый AlertDialog.Builder(this, R.style.AlertDialogBackground); LayoutInflater инфлятор = getLayoutInflater(); Просмотр диалогаView = inflater.inflate(R.layout.dialog_add_workout, null); builder.setView(dialogView); окончательная тренировка EditTextNameEditText = диалогView.findViewById(R.id.editText_workout_name); builder.setPositiveButton("Добавить", новый DialogInterface.OnClickListener() { @Override public void onClick (диалог DialogInterface, int that) { Строка имя тренировки = имя тренировкиEditText.getText().toString().trim(); если (!workoutName.isEmpty()) { WorkoutList.add(новый WorkoutItem(workoutName)); Log.d("WorkoutList", "Тренировка добавлена: " + WorkoutName); recyclerViewAdapter.notifyDataSetChanged(); упражненияMap.put(workoutName, new ArrayList()); сохранить данные(); сохранитьКартуУпражнений(); updateInstructionsVisibility(); } диалог.отклонить(); } }); builder.setNegativeButton("Отмена", новый DialogInterface.OnClickListener() { @Override public void onClick (диалог DialogInterface, int that) { диалог.отклонить(); } }); Диалог AlertDialog = builder.create(); диалог.setOnShowListener(новый DialogInterface.OnShowListener() { @Override public void onShow (DialogInterface диалоговый интерфейс) { Кнопка позитивная кнопка = ((AlertDialog) диалог).getButton(DialogInterface.BUTTON_POSITIVE); Кнопка отрицательныйButton = ((AlertDialog) диалог).getButton(DialogInterface.BUTTON_NEGATIVE); позитивная кнопка.setTextColor(getResources().getColor(R.color.white)); NegativeButton.setTextColor(getResources().getColor(R.color.white)); } }); WindowManager.LayoutParams layoutParams = новый WindowManager.LayoutParams(); макетParams.copyFrom(dialog.getWindow().getAttributes()); макетParams.width = WindowManager.LayoutParams.WRAP_CONTENT; макетParams.height = WindowManager.LayoutParams.WRAP_CONTENT; диалог.getWindow().setAttributes(layoutParams); диалог.шоу(); } частный класс SwipeToDeleteCallback расширяет ItemTouchHelper.SimpleCallback { SwipeToDeleteCallback() { супер(0, ItemTouchHelper.LEFT); } @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { вернуть ложь; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int направление) { int позиция = viewHolder.getAdapterPosition(); WorkoutItem удален.Workout = WorkoutList.get(position); Log.d("SwipedWorkout", "Удаление тренировки: " + deleteWorkout.getName()); WorkList.remove(позиция); recyclerViewAdapter.notifyItemRemoved(позиция); deleteWorkout(deletedWorkout.getName()); сохранить данные(); сохранитьКартуУпражнений(); recyclerViewAdapter.notifyItemRangeChanged(позиция, WorkList.size()); updateInstructionsVisibility(); } } public void deleteWorkout(String WorkName) { Iterator итератор = WorkoutList.iterator(); в то время как (итератор.hasNext()) { WorkoutItem WorkoutItem = iterator.next(); если (workoutItem.getName().equals(workoutName)) { итератор.удалить(); если (exercialsMap.containsKey(workoutName)) { упражненияMap.remove(имя тренировки); Log.d("deleteWorkout", "Упражнения удалены из тренировки: " + WorkName); } еще { Log.e("deleteWorkout", "Упражнения для тренировки не найдены: " + WorkName); } сохранить данные(); сохранитьКартуУпражнений(); updateInstructionsVisibility(); перерыв; } } } частный недействительный saveData () { SharedPreferences SharedPreferences = getSharedPreferences("MyUserPrefs", MODE_PRIVATE); Редактор SharedPreferences.Editor = SharedPreferences.edit(); Gson gson = новый Gson(); Строка json = gson.toJson(workoutList); editor.putString(WORKOUT_LIST_KEY, json); редактор.применить(); Log.d("SaveData", "Список тренировок сохранен в SharedPreferences: " + json); } частная пустота loadData() { SharedPreferences SharedPreferences = getSharedPreferences("MyUserPrefs", MODE_PRIVATE); Gson gson = новый Gson(); String json =sharedPreferences.getString(WORKOUT_LIST_KEY, ""); Тип типа = новый TypeToken(){}.getType(); WorkList = gson.fromJson(json, type); если (workoutList == null) { WorkList = новый ArrayList(); } recyclerViewAdapter = новый WorkoutAdapter (это, WorkoutList, это); recyclerView.setAdapter(recyclerViewAdapter); updateInstructionsVisibility(); Log.d("LoadData", "Список тренировок загружен из SharedPreferences: " + json); } частная пустота updateInstructionsVisibility() { если (workoutList.isEmpty()) { txtViewInstructions.setVisibility(View.VISIBLE); // Показать инструкции textView } еще { txtViewInstructions.setVisibility(View.GONE); // Скрываем инструкции textView } } частная пустота loadExercisionsMap () { SharedPreferences SharedPreferences = getSharedPreferences("MyUserPrefs", MODE_PRIVATE); Gson gson = новый Gson(); String json = SharePreferences.getString(EXERCISES_MAP_KEY, ""); Тип типа = новый TypeToken(){}.getType(); упражненияMap = gson.fromJson(json, type); если (exercisionMap == null) { упражненияMap = новый HashMap(); } Log.d("LoadExercisionsMap", "ExercisionsMap загружен из SharedPreferences: " + json); } частная пустота saveExercisionsMap () { SharedPreferences SharedPreferences = getSharedPreferences("MyUserPrefs", MODE_PRIVATE); Редактор SharedPreferences.Editor = SharedPreferences.edit(); Gson gson = новый Gson(); Строка json = gson.toJson(exercisionMap); editor.putString(EXERCISES_MAP_KEY, json); редактор.применить(); } @Override public void onWorkoutClick (int Position) { if (позиция >= 0 && позиция
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»