entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Como eliminar una fila de un listview con un botón de eliminar

Tengo una actividad en la que cargo en un listview productos desde una consulta de MySQL y cada uno de ellos tiene un botón de eliminar. Pues me gustaría que al darle al botón de eliminar, eliminase dicha fila. (Aunque tuviera que recargar dicha actividad).
Esto es lo que tengo en el adaptador del listview:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ListViewItem item = items.get(position);

    View vi = convertView;

    if (convertView == null){
        if(item.Ingredientes.equals("") && item.Observacion.equals("")){
            vi = inflater.inflate(R.layout.items_carrito2, null);
        }else{
            vi = inflater.inflate(R.layout.items_carrito, null);
        }
    }

    TextView txtNombre = (TextView) vi.findViewById(R.id.txtTitle);
    TextView txtIngredientes = (TextView) vi.findViewById(R.id.textView1);
    TextView txtObservaciones = (TextView) vi.findViewById(R.id.textView2);
    TextView txtCantidad = (TextView) vi.findViewById(R.id.textView3);
    TextView cantidad = (TextView) vi.findViewById(R.id.textView4);
    TextView txtPrecio = (TextView) vi.findViewById(R.id.textView5);
    TextView precio = (TextView) vi.findViewById(R.id.textView6);
    TextView ingredientes = (TextView) vi.findViewById(R.id.textView7);
    TextView observaciones = (TextView) vi.findViewById(R.id.textView8);

    txtNombre.setText(item.Nombre);
    txtIngredientes.setText("Ingredientes:");
    txtObservaciones.setText("Observaciones:");
    txtCantidad.setText("Cantidad:");
    txtPrecio.setText("Precio:");
    ingredientes.setText(item.Ingredientes);
    observaciones.setText(item.Observacion);
    cantidad.setText(CantidadConvertido);
    precio.setText(PrecioConvertido+" €");

    return vi;
}

1 Respuesta

1voto

white Puntos75880

Elimina del arreglo el objeto ListViewItem según su posición y luego usa el método notifyDataSetChanged de tu adaptador:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    // ...

    botonBorrar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            items.remove(position);
            notifyDataSetChanged();
        }
    });
}

0voto

danielreales7 comentado

Si eso lo elimina en el momento, pero no de la Base de Datos, justamente debajo de eso tendría que realizar la petición por POST y lo elimino desde el adaptador no?

0voto

white comentado

Que tal si haces la peticion post y posterior eliminas la fila, haciendolo asíncrono.

peticion post ( eliminar ) ->
    al terminar la peticion ->
       eliminar fila ( aca el codigo con notifyDataSetChanged )

podrias deshabilitar el boton mientras envia la peticion post para evitar que envie la peticion varias veces.

Para esto podrías usar AsyncTask y los callbacks onPostExecute y doInBackground, podrías tambien usar una interface en tu clase AsyncTask para usar un callback.

0voto

danielreales7 comentado

Yo normalmente lo suelo hacer en la clase, no en el adaptador.
Por ejemplo en esta clase misma tengo para eliminar todos los productos de esta manera:

class eliminarPedidos extends AsyncTask<String, String, String>{

    private Activity context;

    eliminarPedidos(Activity context){
        this.context = context;
    }

    String email,passwd,name,phones,direction;
    protected void onPreExecute(){
        // Para el progress dialog
        pDialog = new ProgressDialog(Carrito.this);
        pDialog.setMessage("Eliminando...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        email = params[0];

        if(loginstatus(email)==true){
            return "ok"; //Login válido
        }else{
            return "err"; //Login inválido
        }
    }

    protected void onPostExecute(String result){
        pDialog.dismiss();// Ocultamos progress dialog
        Log.e("onPostExecute=",""+result);

        if(result.equals("ok")){
            Intent i = new Intent(Carrito.this, Carrito.class);
            i.putExtra("user", CorreoPersonal);
            startActivity(i);
        }else{
            err_login();
        }

    }

}

    public boolean loginstatus(String correoL){
        int logstatus = -1;

        ArrayList<NameValuePair>postparameters2send = new ArrayList<NameValuePair>();
        postparameters2send.add(new BasicNameValuePair("correo",correoL));

        JSONArray jdata = post.getserverData(postparameters2send, URL_connect);

        if(jdata != null && jdata.length() > 0){
            JSONObject json_data;
            try{
                json_data = jdata.getJSONObject(0);
                logstatus = json_data.getInt("logstatus");
                Log.e("loginstatus","logstatus = "+logstatus);
            }catch(JSONException e){
                e.printStackTrace();
            }
            if(logstatus == 0){// {{"logstatus":"0"}}
                Log.e("loginstatus","inválido");
                return false;
            }else{
                Log.e("loginstatus","válido");
                return true;
            }
        }else{// JSON obtenido inválido
            Log.e("JSON","ERROR");
            return false;
        }
    }

En este caso mando el email de dicho usuario para que elimine todo, pero en el caso de que vaya eliminar un sólo item tendría que mandarle el ID de dicho item no?

0voto

danielreales7 comentado

Listo lo hice directamente desde el adaptador, sin problemas. Muchas gracias por todo!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta