Member 13040256 Ответов: 0

Обновление / перезагрузка фрагмента при удалении базы данных


У меня есть простое приложение с фрагментом и активностью, размещающее 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, он обновит ваш фрагмент по низкой цене без перезагрузки страницы.

0 Ответов