2011-01-11 1 views
9

Sto cercando di implementare ListView con la funzionalità Elimina per eliminare l'elemento dalla listview. Sono riuscito a cancellare ma non è riuscito ad aggiornare la listview dopo la cancellazione di un oggetto dal database.Android - Listview elimina l'elemento e Aggiorna

In realtà, fare clic su listitem, sto visualizzando AlertBox per l'azione "Cancella" e "Annulla", facendo clic su "Elimina", l'elemento deve essere rimosso dal database e, inoltre, dal listview e listview deve essere aggiornato. Ho anche usato il metodo 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); 
    } 
}); 

e il codice per 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

Che tipo di adattatore stai usando? Se stai usando CursorAdapter, quello che hai descritto dovrebbe funzionare. – Juhani

+0

Le mod non eliminano le domande perché non sei soddisfatto delle risposte, mi dispiace. – Will

risposta

9

chiamata che l'attività una volta Utilizzando intenti

+0

Alla fine, ho già implementato la stessa cosa che hai menzionato. Grazie –

11

lo rimuove dalla scheda di lista? Se non fosse il motivo, il notifyDataSetChanged() non ti farà molto bene.

Guardando di nuovo il tuo codice, posso solo scoprire che lo stai rimuovendo dal tuo database e non dall'adattatore stesso.

modifica (per rispondere al commento): Bene, è difficile fare a meno della vostra classe ListView_CustomAdapter. Il problema è, in questo adattatore c'è un set di dati (quello che hai messo nel costruttore (listitemDisplay)) che deve essere aggiornato pure. Solo allora il notifyDataSetChanged() funzionerà.

+0

mi mostra un modo in cui posso implementare la funzionalità Elimina –

+0

In realtà ho progettato un adattatore listview personalizzato e quindi quando provo ad accedere al metodo "remove" per l'adattatore, non appare nel menu pop-up. –

5

se avete il cursore, chiamare Requery() prima di chiamare notifyDataChanged()

0

Prova chiamando refreshDrawableState a dire l'elenco di ridisegnare.

6

Sto indovinando che usando

getActivity().recreate(); 

invece di riavviare l'attività attraverso un nuovo Intent è meglio perché l'utilizzo di un nuovo Intent si fermerà solo l'attività corrente e non distruggerlo.

In ogni caso, funziona.

+0

Cerchi questo, funziona come un fascino. Grazie – Panache

4

ho fatto qualcosa come questo nel mio adattatore:

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

Questo termina l'attività e poi riprende la stessa.

+0

migliore risposta .... – himanshu

+0

dove prendi il cxt? – Hoo

3

Penso invece di richiamare di nuovo l'attività, è necessario impostare l'adattatore per la visualizzazione elenco sull'opzione di eliminazione di alertBox dopo aver ottenuto i dati aggiornati dal database e inserito nell'elenco listitemDisplay come questo.

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) 
       { 

       } 
     } }); 

Ciò aggiornare la listView

+0

Questo non funziona – AndroidHacker

3

ho la soluzione:

Se si desidera eliminare una riga da una lista cliccando vista sul pulsante DELETE di ciascuno di quella riga fare questo. Qui hai un esempio di una classe adattatore personalizzata con un nome e un pulsante di cancellazione.Ogni volta che si preme il tasto la riga viene eliminata

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

Fai una nuova funzione al di fuori del blocco onCreate {qualcosa di simile ... getdata()} e dentro quella inserto e ottenere tutti i dati e impostato per l'adattatore.
Quindi richiamare di nuovo la funzione nel blocco onResume(). Quindi ogni volta che cancellerai i dati dalla lista, questi rifletteranno immediatamente.