在 Recyclerview 中删除过滤后的项目时,它会重新出现,我该如何避免这种情况?

when deleting a filtered Item in a Recyclerview it reappears, how do I avoid this?

我有一个 Recyclerview,它在顶部有一个搜索栏,可以按“rut”进行过滤,但是当过滤一个项目然后通过按红色垃圾桶按钮将其删除时,当再次将过滤字段留空时该项目会重新出现,我知道这是因为过滤器保留了一个临时数据数组,但是如果我删除了一个项目,我怎么能得到新列表呢?我试了好几种方法都解决不了(如果我重新加载activity可能会看到该项目被删除了,它不会再出现)

留下了我评论的过程的一系列照片。

in the first photo there is a list of 3 items

in the second I filter by the rut "098"

in the third I remove the filtered item "098"

in the fourth I no longer There is this item

but in the fifth, when eliminating what is written in the edittext (filter), the item "098" appears again and it brings company, because the items are duplicated

适配器代码

    @Override
    public void onBindViewHolder(@NonNull PacientesviewHolder holder, int position) {
        Pacientes paciente = list.get(position);

        holder.cv.setAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_transition));

        holder.textViewRut.setText(paciente.getRut());
        holder.textViewNombre.setText(paciente.getNombre());
        holder.textViewApellidos.setText(paciente.getApellidos());

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatabaseReference ref = FirebaseDatabase.getInstance().getReference() // Firebase reference to after remove item
                        .child("Pacientes"+userID_S)
                        .child(paciente.getKey());

                new AlertDialog.Builder(context)
                        .setIcon(R.drawable.ic_warning)
                        .setTitle("¿Seguro desea borrar a este paciente?") // to confirm deletion
                        .setCancelable(false)
                        .setNegativeButton(android.R.string.cancel, null)
                        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                int newPosition = holder.getAdapterPosition();
                                list.remove(newPosition);
                                notifyItemRemoved(newPosition);
                                notifyItemRangeChanged(newPosition, list.size());

                                ref.removeValue();
                                list.clear();

                                notifyDataSetChanged();    
                                  
                                }
                        }).show();
            }
        });

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(paciente);
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class PacientesviewHolder extends RecyclerView.ViewHolder {

        TextView textViewRut, textViewNombre, textViewApellidos;
        CardView cv;
        ImageView delete;

        public PacientesviewHolder(@NonNull View itemView) {
            super(itemView);
            textViewRut = itemView.findViewById(R.id.textview_rut);
            textViewNombre = itemView.findViewById(R.id.textview_nombre);
            textViewApellidos = itemView.findViewById(R.id.textview_apellidos);
            cv = itemView.findViewById(R.id.cv);

            delete = itemView.findViewById(R.id.ic_delete);

        }
    }

    public void filterList(ArrayList<Pacientes> filteredList) { // Filter
        list = filteredList;
        notifyDataSetChanged();
    }
}

显示回收器视图和过滤器所在的代码

public class mostrarActivity extends AppCompatActivity {

    RecyclerView recyclerPa;
    DatabaseReference database;
    Adapter adapter;
    public ArrayList<Pacientes> list;
    String userID, userID_S;
    EditText editSearch;

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

        ocultarUpBar();

        userID = FirebaseAuth.getInstance().getCurrentUser().getUid();
        userID_S = userID.substring(0,5);

        recyclerPa = findViewById(R.id.RecyclerPa);
        database = FirebaseDatabase.getInstance().getReference("Pacientes"+userID_S);
        recyclerPa.setHasFixedSize(true);
        recyclerPa.setLayoutManager(new LinearLayoutManager(this));

        list = new ArrayList<>();
        adapter = new Adapter(this, list, new Adapter.OnItemClickListener() {
            @Override
            public void onItemClick(Pacientes item) {
                move(item);
            }
        });
        recyclerPa.setAdapter(adapter);

        database.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                    Pacientes pacientes = dataSnapshot.getValue(Pacientes.class);

                    pacientes.setKey(dataSnapshot.getKey());

                    list.add(pacientes);

                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

        editSearch = findViewById(R.id.editSearch);
        editSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                filter(s.toString());
            }
        });
    }

    // Funciones

    private void filter(String text) {
        ArrayList<Pacientes> filteredList = new ArrayList<>();

        
        for (Pacientes item : list) {
            if (item.getRut().toLowerCase().contains(text.toLowerCase())) {
                filteredList.add(item);
            }
        }
        adapter.filterList(filteredList);
    }

    public void move(Pacientes item){
        Intent intent = new Intent(this, FichaPacientes_Activity.class);
        intent.putExtra("pacienteDetalles", item);
        startActivity(intent);
        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
    }
           
       
}

尝试使用

notifyItemRemoved(i);
notifyDataSetChanged();

其中 i 是已删除项目的索引。

Almost Done Dude 简单错误导致此问题

database.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
            // Clear list here your Activity class list
            list.clear()
                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                    Pacientes pacientes = dataSnapshot.getValue(Pacientes.class);

                    pacientes.setKey(dataSnapshot.getKey());
                    // One more thing you can do is verify object
                    if(!list.containes(pacientes)){ // Check if not contains then add
                       list.add(pacientes);
                    }


                }
                // add this method in  your adapter and then 
                adapter.updateList(list)
                // No need if you call notifydatasetChanged here if call in above method
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

适配器更新列表方法

    // Sorry for kotlin :-)
    fun updateList(it: List<ModelItem>) {
        if (it != null) {
            list = it
        }
        notifyDataSetChanged()
    }