Обновление / перезагрузка фрагмента при удалении базы данных
У меня есть простое приложение с фрагментом и активностью, размещающее RecyclerView, с данными из базы данных, у меня есть функция удаления в моем адаптере, содержимое удаляется из базы данных, но представление не обновляется. Я попробовал несколько ответов на подобные вопросы, но не смог их исправить. Пожалуйста, найдите фрагменты кода для моего фрагмента и адаптера.
Фрагмент Кода:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_medication, container, false); medicationsArrayList = new ArrayList<>(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); String userId = sharedPreferences.getString(Preferences.USERID,null); if (userId != null) { databaseReference = FirebaseDatabase.getInstance().getReference().child("users").child(userId).child("medications"); } toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); toolbar.setTitle(getString(R.string.medication)); addMedButton = (FloatingActionButton) view.findViewById(R.id.addMedicationButton); recyclerView = (RecyclerView) view.findViewById(R.id.medications_recycler); recyclerView.setNestedScrollingEnabled(false); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext()); recyclerView.setLayoutManager(mLayoutManager); databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot snapshot : dataSnapshot.getChildren()){ Medication medication = snapshot.getValue(Medication.class); String medicationKey = snapshot.getKey(); medication.setKey(medicationKey); medicationsArrayList.add(medication); } mAdapter = new MedicationsAdapter(getContext(), medicationsArrayList); recyclerView.setAdapter(mAdapter); registerForContextMenu(recyclerView); } @Override public void onCancelled(DatabaseError databaseError) { } });
Код Адаптера:
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.medications_adapter, parent, false); return new ViewHolder(itemView); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { Medication medication = mMedicationList.get(position); holder.dateMed.setText(medication.getDateMed()); holder.medicationName.setText(medication.getMedicationName()); holder.dosage.setText(medication.getDosage() + " " + mContext.getString(R.string.dosageUnit)); holder.initialTime.setText(medication.getInitialTime()); holder.startDate.setText(medication.getStartDate()); holder.endDate.setText(medication.getEndDate()); holder.frequency.setText(medication.getFrequency()); holder.medication_key.setText(medication.getKey()); holder.reason.setText(medication.getReason()); } @Override public int getItemCount() { if (mMedicationList == null) { return 0; } else { return mMedicationList.size(); } } class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener { TextView dateMed, medicationName, dosage, initialTime, startDate, endDate, frequency, reason, medication_key; ViewHolder(View v) { super(v); v.setOnCreateContextMenuListener(this); dateMed = (TextView) v.findViewById(R.id.dateMedAdd); medicationName = (TextView) v.findViewById(R.id.medicationName); dosage = (TextView) v.findViewById(R.id.dosage); initialTime = (TextView) v.findViewById(R.id.initialTime); startDate = (TextView) v.findViewById(R.id.startDate); endDate = (TextView) v.findViewById(R.id.endDate); frequency = (TextView) v.findViewById(R.id.frequency); reason = (TextView) v.findViewById(R.id.reason); medication_key = (TextView) v.findViewById(R.id.medication_key); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { menu.setHeaderTitle("Medications Options"); MenuItem editMed = menu.add(0, v.getId(), 0, "Edit");//groupId, itemId, order, title MenuItem deleteMed = menu.add(0, v.getId(), 0, "Delete"); editMed.setOnMenuItemClickListener(medicationsMenuClicked); deleteMed.setOnMenuItemClickListener(medicationsMenuClicked); } private void deleteVitalsByKey(String key) { DatabaseReference databaseReference; databaseReference = FirebaseDatabase.getInstance().getReference().child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("medications").child(key); databaseReference.removeValue(); } private final MenuItem.OnMenuItemClickListener medicationsMenuClicked = new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { View v = item.getActionView(); if (item.getTitle() == "Edit") { Toast.makeText(mContext, "Redirecting to edit screen", Toast.LENGTH_LONG).show(); Intent editMedIntent = new Intent(mContext, MedicationActivity.class); editMedIntent.putExtra("medications_key", medication_key.getText()); mContext.startActivity(editMedIntent); return true; } else if (item.getTitle() == "Delete") { Toast.makeText(mContext, "Deleting", Toast.LENGTH_LONG).show(); deleteVitalsByKey(medication_key.getText().toString()); return true; } return false; } };
Я просто хочу обновить представление фрагмента, чтобы отразить операцию удаления. Пожалуйста, помогите.
Что я уже пробовал:
1) обновите ArrayList из фрагмента, где создается recyclerView, установите новые данные в adapter, а затем вызовите adapter. notifyDataSetChanged (); это не сработало.
2)Создайте новый адаптер, как это делали другие, и он работал для них, но не менялся для меня: recyclerView. setAdapter(new RecyclerViewAdapter(newArrayList))
3) создал метод уведомления в адаптере, и он тоже не сработал!
[no name]
Вы можете запросить файл Ajax, нажав на кнопку create, он обновит ваш фрагмент по низкой цене без перезагрузки страницы.