2011-01-11 1 views
9

Я пытаюсь реализовать функцию ListView with Delete для удаления элемента из списка. Мне удастся удалить, но не удалось обновить список после удаления элемента из базы данных.Android - Listview удалить элемент и обновить

Фактически, нажмите на listitem, я отображаю AlertBox для действия «Удалить» и «Отменить», при нажатии «Удалить» элемент должен быть удален из базы данных, а также из списка, а список должен быть обновлен. Я также использовал метод 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); 
    } 
}); 

и код 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

Какой адаптер вы используете? Если вы используете CursorAdapter, то то, что вы описали, должно работать. – Juhani

+0

Моды не удаляют вопросы, потому что вы недовольны ответами, извините. – Will

ответ

9

вызовов, что активность в очередной раз с помощью Intent

+0

В конце, я уже реализовал то же, что и вы упомянули. Thanx –

11

ли удалить его из списка адаптер? Если это не так, то notifyDataSetChanged() не принесет вам много пользы.

На самом деле, глядя на ваш код снова, я могу только найти, что вы удаляете его из своей базы данных, а не самого адаптера.

Редактировать (ответить на комментарии): Ну, это сложно сделать без вашего класса ListView_CustomAdapter. Проблема в том, что в этом адаптере есть набор данных (тот, который вы ввели в конструктор (listitemDisplay)), который также необходимо обновить. Только тогда будет работать notifyDataSetChanged().

+0

PLS показать мне способ, которым я могу реализовать функцию Delete –

+0

На самом деле я разработал пользовательский адаптер listview и тем самым, когда я пытаюсь получить доступ к методу «удалить» для адаптера, он не появляется во всплывающем меню. –

5

если у вас есть курсор, вызовите перезапрос() перед вызовом notifyDataChanged()

0

Попробуйте позвонить refreshDrawableState сказать список перерисовывать.

6

Я предполагаю, что использование

getActivity().recreate(); 

вместо возобновления деятельности с помощью нового Intent лучше, потому что с помощью нового Намерения будет только остановить текущую деятельность, а не разрушать его.

В любом случае, это работает.

+0

Ищет это, работает как шарм. Thank – Panache

4

я сделал что-то вроде этого в моем адаптере:

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

Это заканчивает свою деятельность, а затем начинается то же самое один раз.

+0

лучший ответ .... – himanshu

+0

где u получить cxt? – Hoo

3

Я думаю, что вместо того, чтобы снова вызывать операцию, вы должны установить адаптер в listview в опции deleteBox delete после получения обновленных данных из базы данных и включения в список listitemDisplay, как это.

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

       } 
     } }); 

Это освежит ListView

+0

Это не работает – AndroidHacker

3

У меня есть решение:

Если вы хотите удалить строку из представления списка щелчком на кнопке DELETE каждого из этой строки сделать это. Здесь у вас есть пример пользовательского класса адаптера с именем и кнопкой удаления.Каждый раз при нажатии кнопки удаляется строка

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

Сделать новую функцию вне вашего OnCreate блока {что-то вроде ... GetData()} и внутри этой вставки и получить все данные и установить в адаптер.
Затем вызовите функцию снова в своем блоке onResume(). Поэтому всякий раз, когда вы удаляете данные из списка, он будет сразу отражен.

 Смежные вопросы

  • Нет связанных вопросов^_^