2011-01-11 11 views
9

Próbuję zaimplementować ListView z funkcją usuwania, aby usunąć element z widoku listy. Udało mi się usunąć, ale nie udało się odświeżyć listy po usunięciu elementu z bazy danych.Android - Wyświetl listę usuń element i Odśwież

Właściwie, kliknij na liście, wyświetlam AlertBox dla akcji "Usuń" i "Anuluj", po kliknięciu "Usuń", element powinien zostać usunięty z bazy danych, a także z listy i listy powinien zostać odświeżony. Użyłem również metody 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); 
    } 
}); 

i kod dla 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

Jakiego rodzaju adaptera używasz? Jeśli używasz CursorAdapter, to co opisałeś powinno działać. – Juhani

+0

Mody nie usuwają pytań, ponieważ nie jesteś zadowolony z odpowiedzi, przepraszam. – Will

Odpowiedz

9

Zaproszenie że aktywność ponownie Korzystanie Intent

+0

Pod koniec już zaimplementowałem to samo, co wspomniałeś. Thanx –

11

Czy usunąć go z listy zasilacza? Jeśli nie, to powód, dla którego notifyDataSetChanged() nie zrobi ci wiele dobrego.

Właściwie patrząc na twój kod, mogę tylko stwierdzić, że usuwasz go z bazy danych, a nie z samego adaptera.

edytuj (aby odpowiedzieć na komentarz): Trudno jest zrobić bez swojej klasy ListView_CustomAdapter. Problem polega na tym, że w tym adapterze znajduje się zestaw danych (ten, który wstawia się do konstruktora (listitemDisplay)), który również wymaga aktualizacji. Tylko wtedy zadziała notifyDataSetChanged().

+0

pls pokaż mi sposób, w jaki mogę zaimplementować funkcję usuwania –

+0

Właściwie zaprojektowałem niestandardowy adapter widoku listy, a tym samym, gdy próbuję uzyskać dostęp do metody "remove" dla adaptera, nie pojawia się ona w wyskakującym menu. –

5

jeśli kursor, zadzwoń Requery() przed wywołaniem notifyDataChanged()

0

Spróbuj zadzwonić refreshDrawableState powiedzieć listę odświeżenia.

6

Zgaduję, że za pomocą

getActivity().recreate(); 

zamiast ponownego uruchomienia działalności przez nowego Intencyjnego jest lepiej, bo przy użyciu nowego Intent zatrzyma tylko bieżącej działalności, a nie ją niszczyć.

W każdym razie to działa.

+0

Szukasz tego, działa jak czar. Dziękujemy – Panache

4

zrobiłem coś takiego w moim adaptera:

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

To kończy działalność, a następnie ponownie uruchamia ten sam jeden.

+0

najlepsza odpowiedź .... – himanshu

+0

gdzie można uzyskać cxt? – Hoo

3

Myślę, że zamiast ponownie wywoływać działanie, należy ustawić adapter na widok listy w opcji alertBox delete po uzyskaniu zaktualizowanych danych z bazy danych i umieszczeniu na liście listitemDisplay w ten sposób.

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

       } 
     } }); 

To odświeżyć ListView

+0

To nie działa – AndroidHacker

3

Mam rozwiązanie:

Jeśli chcesz usunąć wiersz z listy widoku kliknięcie na przycisk Usuń każdego z tego wiersza to zrobić. Oto przykład niestandardowej klasy adaptera z nazwą i przyciskiem usuwania.Za każdym razem po naciśnięciu przycisku wiersz zostanie usunięty

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

Dodać nową funkcję poza blokiem onCreate {coś ... getdata()} i wewnątrz tej wkładki i uzyskać wszystkie swoje dane i ustawienia do adaptera.
Następnie wywołaj funkcję ponownie w swoim bloku onResume(). Tak więc, gdy usuniesz dane z listy, natychmiast to odzwierciedli.

Powiązane problemy