Android Studio delete item from Recycler View

0

I'm trying to delete items from a Recycler View, which I upload to a SQLite database. Selecting the "Delete" button deletes the record from the SQLite database, until it's all right, but it does not erase the element itself from the Recycler View.

This is my delete method () created in my DataBase class:

    public String eliminar(String Nombre){
    String mensaje ="";
    SQLiteDatabase db = this.getWritableDatabase();
    int cantidad = db.delete("pets", "nombre='" + Nombre + "'", null);
    if (cantidad != 0){
        mensaje = "Eliminado correctamente";
    }
    else{
        mensaje = "No hay registros que eliminar";
    }
    return mensaje;
}

And this is what my "Delete" button does in my RecyclerViewAdapter class:

            bnBorrar.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                BaseDeDatos db = new BaseDeDatos(context);
                String Nombre = nombre.getText().toString();
                String mensaje = db.eliminar(Nombre);
                Toast.makeText(context, mensaje, Toast.LENGTH_SHORT).show();
            }
        });

To be clear, I leave an image of an element loaded in my RecyclerView, which should disappear when I press the "DELETE" button:

Thank you very much!

EDITED

Recycler Class:

public class RecyclerViewEnganche extends RecyclerView.Adapter<RecyclerViewEnganche.ViewHolder>  {
private ArrayList<PetsActivity> mExampleList;
private OnItemClickListener mListener;
List<PetsActivity> data;

public void update(ArrayList<PetsActivity> datas){
    data.clear();
    data.addAll(datas);
    notifyDataSetChanged();
}

public interface OnItemClickListener extends View.OnClickListener {
    void onDeleteClick(int position);
}

public void setOnItemClickListener(View.OnClickListener listener) { mListener = (OnItemClickListener) listener; }

public static class ViewHolder extends RecyclerView.ViewHolder  {
    public TextView nombre, edad, raza, alergia;
    public String id, reserva;
    public Button bnCuidados, bnBorrar;
    Context context;

    public ViewHolder(View v, final OnItemClickListener listener) {
        super(v);
        context = v.getContext();
        nombre = v.findViewById(R.id.tveNombre);
        edad = v.findViewById(R.id.tveEdad);
        raza = v.findViewById(R.id.tveRaza);
        alergia = v.findViewById(R.id.tveAlergia);

        bnCuidados = v.findViewById(R.id.bnCuidados);
        bnBorrar = v.findViewById(R.id.bnBorrar);

        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        listener.onDeleteClick(position);
                    }
                }

            }

        });
    }


    void setOnClickListeners() {

        bnCuidados.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, ElegirCuidados.class);
                intent.putExtra("id", id);
                intent.putExtra("reserva", reserva);
                context.startActivity(intent);
            }
        });
        bnBorrar.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                BaseDeDatos db = new BaseDeDatos(context);
                String Nombre = nombre.getText().toString();
                String mensaje = db.eliminar(Nombre);
                Toast.makeText(context, mensaje, Toast.LENGTH_SHORT).show();
            }
        });

    }

}

public List<Pets> listaPets;

public RecyclerViewEnganche(List<Pets> listaPets) {
    this.listaPets = listaPets;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.itempets,parent,false);
    ViewHolder viewHolder=new ViewHolder(view, null);
    // view.setOnClickListener(this);

    return new ViewHolder(view, null);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.nombre.setText(listaPets.get(position).getNombre());
    holder.edad.setText("Edad: " + listaPets.get(position).getEdad());
    holder.raza.setText("Raza: " + listaPets.get(position).getRaza());
    holder.alergia.setText("Alergias: " + listaPets.get(position).getAlergia());
    holder.reserva = listaPets.get(position).getReserva();
    holder.setOnClickListeners();
}


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

}

Main Class:

public class PetsActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private RecyclerViewEnganche enganchePet;

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

    recyclerView = findViewById(R.id.rvPets);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));


    BaseDeDatos tablaPets = new BaseDeDatos(getApplicationContext());

    enganchePet = new RecyclerViewEnganche(tablaPets.mostrarPets());
    recyclerView.setAdapter(enganchePet);

    enganchePet.setOnItemClickListener(new RecyclerViewEnganche.OnItemClickListener(){

        @Override
        public void onClick(View v) {

        }

        @Override
        public void onDeleteClick(int position) {
            removeItem(position);
        }
    });
}

private void removeItem(int position) {
    enganchePet.notifyItemRemoved(position);
}

}

    
asked by Rodrigo 25.11.2018 в 20:23
source

1 answer

0

On your adapter you have your fix public List<Pets> listaPets; That arrangement is what you are painting in your RecyclerView . So what you have to do is delete the element from BD and also delete that element from listaPets . Once you have deleted from both sides, you have to notify the user interface to be updated.

@Override
public void onClick(View v) {
    BaseDeDatos db = new BaseDeDatos(context);
    String Nombre = nombre.getText().toString();
    String mensaje = db.eliminar(Nombre);
    if(mensaje=="Eliminado correctamente"){
        for(int i=0;i<listaPets.size();i++){
             if(listaPets.get(i).getNombre()==Nombre){
                   listaPets.remove(i);
                   break;
             }
        }
        //enganchePet.notifyDataSetChanged();
        notifyDataSetChanged();
    }
    Toast.makeText(context, mensaje, Toast.LENGTH_SHORT).show();
}

As a note, there is the method notifyItemRemoved . To that method you have to send the index of the item that you deleted. In terms of performance it is better than notifyDataSetChanged since with the notifyItemRemoved android only updates that information segment and with the notifyDataSetChanged it reloads all the information.

    
answered by 27.11.2018 / 02:55
source