Android - ListView удалить элемент и обновить - PullRequest
9 голосов
/ 11 января 2011

Я пытаюсь реализовать функцию ListView с функцией Delete, чтобы удалить элемент из списка. Я успешно удалил, но не смог обновить представление списка после удаления элемента из базы данных.

На самом деле, нажмите на элемент списка, я показываю 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();
     }

Ответы [ 9 ]

11 голосов
/ 11 января 2011

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

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

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

9 голосов
/ 11 января 2011

Вызовите это действие еще раз, используя намерение

6 голосов
/ 21 января 2013

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

getActivity().recreate();

вместо перезапуска действия через новое намерение, поскольку использование нового намерения только остановит текущее действие и не уничтожит его.

Во всяком случае, это работает.

5 голосов
/ 11 января 2011

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

4 голосов
/ 01 августа 2013

Я сделал что-то подобное в своем адаптере:

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

Это завершает действие, а затем снова запускает то же самое.

3 голосов
/ 17 ноября 2014

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

Если вы хотите удалить строку из списка, нажмите кнопку «УДАЛИТЬ» в каждой строке.Здесь у вас есть пример пользовательского класса адаптера с именем и кнопкой удаления.При каждом нажатии кнопки строка удаляется

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;
}
}
3 голосов
/ 06 января 2014

Я думаю, что вместо того, чтобы снова вызывать действие, вы должны установить для адаптера значение списка в опции удаления alertBox после получения обновленных данных из базы данных и помещения в список 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 голосов
/ 12 мая 2016

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

0 голосов
/ 11 января 2013

Попробуйте вызвать refreshDrawableState, чтобы сообщить списку для перерисовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...