当删除Recyclerview中的筛选项目时,它会重新出现,我该如何避免这种情况



我有一个Recyclerview,它在顶部有一个搜索栏,可以通过"rut";,但是当过滤一个项目,然后按下红色垃圾按钮删除它时,当过滤器字段再次为空时,该项目会重新出现,我知道这是因为过滤器保留了一个临时的数据数组,但如果我删除了一个项目的话,我怎么能得到新的列表?我已经尝试了几种方法,但我无法解决它(如果我重新加载活动,可能会看到该项目已被删除,并且不会再次出现(

留下了一系列我评论的手术照片。

在第一张照片中有一个3项的列表

在第二个I中;098";

在第三步骤中;098";

在第四个我不再有这个项目

但在第五种情况下,当删除edittext(过滤器(中所写的内容时;098";再次出现,它带来了公司,因为项目是重复的

适配器代码

@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);
}


}

几乎完成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()
}

尝试使用

notifyItemRemoved(i);
notifyDataSetChanged();

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