2011-01-11 18 views
9

Estoy tratando de implementar ListView con la funcionalidad Eliminar para eliminar elemento de la vista de lista. Pude borrar pero no pude actualizar la vista de lista después de eliminar un elemento de la base de datos.Android - Listview eliminar elemento y Actualizar

En realidad, haga clic en listitem, estoy mostrando AlertBox para "Eliminar" y "Cancelar" acción, al hacer clic en "Eliminar", el elemento debe eliminarse de la base de datos y debe actualizarse desde la vista de lista y lista. También he usado el método notifyDataSetChanged().

lview = (ListView) findViewById(R.id.lview); 
adapter = new ListView_CustomAdapter(this, listitemDisplay); 
lview.setAdapter(adapter); 

lview.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) 
    { 
     Show_Alert_box(v.getContext(),"Please select action.",position); 
    } 
}); 

y el código para Show_Alert_box:

public void Show_Alert_box(Context context, String message,int position) 
    { 
     final int pos = position; 

     final AlertDialog alertDialog = new AlertDialog.Builder(context).create(); 
      alertDialog.setTitle(getString(R.string.app_name_for_alert_Dialog)); 
      alertDialog.setButton("Delete", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 

        try 
        { 
         db.open(); 
           String[] whereArgs={String.valueOf(pkID)}; 
     return db.delete(DATABASE_TABLE_4,"pk_pkID == ?",whereArgs);  
         adapter.notifyDataSetChanged(); 
         db.close(); 
        } 
        catch(Exception e) 
        { 

        } 
      } }); 
      alertDialog.setButton2("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
      } }); 

      alertDialog.setMessage(message); 
      alertDialog.show(); 
    } 
+0

¿Qué tipo de adaptador estás usando? Si usa CursorAdapter, lo que describió debería funcionar. – Juhani

+0

Las modificaciones no eliminan las preguntas porque no está contento con las respuestas, lo siento. – Will

Respuesta

9

de llamada que una vez más Actividad Usando Intención

+0

Al final, ya he implementado el mismo que usted mencionó. Gracias –

11

lo hace de extraerla del adaptador de la lista? Si no fuera por eso, el notifyDataSetChanged() no le hará mucho bien.

Actualmente volviendo a encontrar el código, solo puedo encontrar que lo está eliminando de su base de datos y no del adaptador en sí.

editar (para responder al comentario): Bueno, eso es difícil de hacer sin su clase ListView_CustomAdapter. El problema es que en este adaptador hay un conjunto de datos (el que pone en el constructor (listitemDisplay)) que también debe actualizarse. Solo entonces el notifyDataSetChanged() funcionará.

+0

pls muéstrame un camino por el cual puedo implementar la funcionalidad Eliminar –

+0

En realidad, he diseñado un adaptador de vista de lista personalizado y por lo tanto, cuando intento acceder al método "eliminar" para el adaptador, no aparece en el menú emergente. –

5

si tiene el cursor, llame nueva consulta() antes de llamar notifyDataChanged()

0

Intente llamar refreshDrawableState para contar la lista para volver a dibujar.

6

supongo que el uso de

getActivity().recreate(); 

en lugar de reiniciar la actividad a través de un nuevo intento es mejor, porque el uso de un nuevo intento sólo se detendrá la actividad actual y no destruirlo.

De todos modos, funciona.

+0

Buscando esto, funciona como un encanto. Gracias – Panache

4

he hecho algo como esto en mi adaptador:

((Activity)cxt).finish(); 
Intent intent = new Intent(cxt, YourActivity.class); 
cxt.startActivity(intent); 

Esto pone fin a la actividad y luego se inicia el mismo de nuevo.

+0

mejor respuesta .... – himanshu

+0

donde obtienes el cxt? – Hoo

3

Creo que en lugar de volver a llamar a la actividad, debe configurar el adaptador a la vista de lista en la opción de eliminar alertBox después de obtener los datos actualizados de la base de datos y ponerlos en la lista listitemDisplay como esta.

alertDialog.setButton("Delete", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
       try 
       { 
        db.open(); 
          String[] whereArgs={String.valueOf(pkID)}; 
        return db.delete(DATABASE_TABLE_4,"pk_pkID == ?",whereArgs); 
        listitemDisplay = db.getItemFromDB(); 
        adapter = new ListView_CustomAdapter(this, listitemDisplay); 
        lview.setAdapter(adapter); 
        db.close(); 
       } 
       catch(Exception e) 
       { 

       } 
     } }); 

Esto actualizará la vista de lista

+0

Esto no está funcionando – AndroidHacker

3

tengo la solución:

Si desea eliminar una fila de una vista de lista haciendo clic en el botón ELIMINAR de cada una de esa fila hacer esto. Aquí tiene un ejemplo de una clase de adaptador personalizado con un nombre y un botón de eliminar.Cada vez que se pulsa el botón se suprime la línea

public class UserCustomAdapter extends ArrayAdapter<User>{ 

Context context; 
int layoutResourceId; 
ArrayList<User> data = new ArrayList<User>(); 

public UserCustomAdapter(Context context, int layoutResourceId,ArrayList<User> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    UserHolder holder = null; 


    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new UserHolder(); 
     holder.textName = (TextView) row.findViewById(R.id.textView1); 
     holder.btnDelete = (Button) row.findViewById(R.id.button2); 
     row.setTag(holder); 
    } else { 
     holder = (UserHolder) row.getTag(); 

    } 

    User user = data.get(position); 


    holder.btnDelete.setTag(position); 
    holder.textName.setText(user.getName()); 



    holder.btnDelete.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      String pos = v.getTag().toString(); 
      int _posicion = Integer.parseInt(pos); 
      data.remove(_posicion); 
      notifyDataSetChanged(); 

     } 
    }); 

    return row; 


} 

static class UserHolder { 
    TextView textName; 
    Button btnDelete; 
} 
} 
0

hacer una nueva función que está fuera de su bloque onCreate {algo así como ... leedato()} y dentro de esa inserción y obtener todos sus datos y establece en el adaptador.
Luego, vuelva a llamar a la función en su bloque onResume(). Entonces, cuando elimine los datos de la lista, se reflejará de inmediato.

Cuestiones relacionadas