我有一個 Recyclerview,它在頂部有一個搜索欄,可以按“rut”進行過濾,但是當過濾一個專案然后通過按下紅色垃圾桶按鈕將其洗掉時,當過濾器欄位再次留空時,該專案會重新出現,我知道它發生的原因是過濾器保留了一個臨時的資料陣列,但是如果我洗掉了一個專案,我如何才能獲得新串列?我嘗試了幾種方法,但我無法解決它(如果我重新加載活動,可能會看到該專案已被洗掉并且不會再次出現)
留下了我評論的程序的一系列照片。
在第一張照片中有一個包含 3 個專案的串列
在第二個我通過車轍“098”過濾
在第三個中,我洗掉了過濾后的專案“098”
在第四個我不再有這個專案
但是在第五個中,當洗掉編輯文本(過濾器)中的內容時,專案“098”再次出現并帶來公司,因為專案重復
配接器代碼
package com.example.psicoapp;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.ArrayList;
public class Adapter extends RecyclerView.Adapter<Adapter.PacientesviewHolder>{
Context context;
ArrayList<Pacientes> list;
String userID, userID_S;
final Adapter.OnItemClickListener listener;
public interface OnItemClickListener {
void onItemClick(Pacientes item);
}
public Adapter(Context context, ArrayList<Pacientes> list, OnItemClickListener listener) {
this.context = context;
this.list = list;
this.listener = listener;
userID = FirebaseAuth.getInstance().getCurrentUser().getUid();
userID_S = userID.substring(0,5);
}
@NonNull
@Override
public PacientesviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
return new PacientesviewHolder(v);
}
@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();
/*Intent intent = new Intent(v.getContext(), mostrarActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
v.getContext().startActivity(intent);*/
//ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation((Activity) v.getContext());
}
}).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();
}
}
顯示回收站視圖和過濾器所在位置的代碼
package com.example.psicoapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
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<>();
if (text.isEmpty()){
Toast.makeText(this, "vacio", Toast.LENGTH_SHORT).show();
}
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);
}
private void ocultarUpBar(){
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
}
@Override
public void finish() {
super.finish();
Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}
}
uj5u.com熱心網友回復:
嘗試使用
notifyItemRemoved(i);
notifyDataSetChanged();
其中 i 是已洗掉專案的索引。
uj5u.com熱心網友回復:
幾乎完成了 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()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385220.html
標籤:安卓 火力基地 火力实时数据库 android-recyclerview
下一篇:setDoc函式回傳什么?
