Невозможно использовать notifyDataSetChanged для обновления адаптера

Я не могу обновить свой ListView после удаления элемента. Элемент Listview удаляется из базы данных, но я не могу обновить свой адаптер, и он продолжает показывать удаленный элемент в listView.

если я ставлю adapter.notiftDataSetChanged();, он странно окрашивается в красный код! И показывает, что cannot resolve the method notifyDataSetChanged().

Вот мой код.

ArrayList<HashMap<String, String>> items = new ArrayList<>();
List<TRListFormat> list = trDb.getAllReminders();

for (TRListFormat val : list) {
    HashMap<String, String> map = new HashMap<>();
    map.put("title",val.getTitle());
    map.put("description", val.getDes());
    map.put("date", val.getDate());
    map.put("time", val.getTime());

    items.add(map);
}

adapter = new SimpleAdapter(this, items, R.layout.tr_list_format,
          new String[] { "title", "description", "date", "time" },
          new int[] {R.id.tbr_title, R.id.tbr_des, R.id.tbr_date, R.id.tbr_time });

lv = (ListView)findViewById(R.id.tbr_list);
lv.setAdapter(adapter);

мой setOnItemClickListener, он отображает AlertDialog с 3 кнопками при нажатии элемента списка.

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(final AdapterView<?> adapterView, View view, int position, final long id) {
            AlertDialog.Builder builder = new AlertDialog.Builder(TRList.this);
            builder.setTitle("Select the Action");
            builder.setMessage("Do anything");
            builder.setPositiveButton("Edit",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            int remId = (int)id;
                            Bundle dataBundle = new Bundle();
                            dataBundle.putInt("remId", remId);
                            Intent intent = new Intent(getApplicationContext(),TRTimeReminder.class);
                            intent.putExtras(dataBundle);
                            startActivity(intent);
                        }
                    });
            builder.setNeutralButton("Deactivate",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    });
            builder.setNegativeButton("Delete",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            int remId = (int)id + 1;
                            TRListFormat format = trDb.getReminder(remId);
                            String title = format.getTitle();
                            String des = format.getDes();
                            String date = format.getDate();
                            String time = format.getTime();
                            trDb.deleteReminder(new TRListFormat(remId, title, des, date, time));

                            Toast.makeText(getApplicationContext(), "Reminder: "+title+"deleted",
                                    Toast.LENGTH_SHORT).show();

                            adapter.notifyDataSetChanged();  //this line shows an error I have written above
                        }
                    });

            AlertDialog alert = builder.create();
            alert.show();
        }
    });

person Apurva    schedule 04.02.2015    source источник
comment
какую ошибку вы получаете?   -  person ρяσѕρєя K    schedule 04.02.2015
comment
@ρяσѕρєяK ошибка cannot resolve method 'notifyDataSetChanged()'   -  person Apurva    schedule 04.02.2015
comment
@ Rohit5k2 Я уже определил адаптер на уровне класса (до метода onCreate()).   -  person Apurva    schedule 04.02.2015
comment
Да, понял из сообщения об ошибке в комментарии. Я увидел ошибку в сообщении cannot resolve the symbol, поэтому подумал, что проблема может быть в ней.   -  person Rohit5k2    schedule 04.02.2015
comment
Попробуйте adapterView.getAdapter()   -  person Rohit5k2    schedule 04.02.2015
comment
@Rohit5k2 Rohit5k2 извините, я исправил ошибку в своем вопросе   -  person Apurva    schedule 04.02.2015
comment
@Rohit5k2 вместо adapter.notifyDataSetChanged()??   -  person Apurva    schedule 04.02.2015
comment
adapterView.getAdapter().notifyDataSetChanged();   -  person Rohit5k2    schedule 04.02.2015
comment
@Rohit5k2 пробовал, не работает, показывает ту же ошибку   -  person Apurva    schedule 04.02.2015
comment
@danny117 не работает! Я тоже пробовал, я пытаюсь решить это с 2 дней, до сих пор не нашел решения   -  person Apurva    schedule 04.02.2015
comment
Я понимаю. notifyDataSetChanged недоступен для SimpleAdapter. Позвольте мне написать ответ для вас.   -  person Rohit5k2    schedule 04.02.2015
comment
@Apurva Пожалуйста, посмотрите мой ответ.   -  person Rohit5k2    schedule 04.02.2015


Ответы (1)


Решение 1 (предпочтительнее)

notifyDataSetChanged недоступен для SimpleAdapter. SimpleAdapter предназначен для статических данных. Вам следует использовать адаптер другого типа, например ArrayAdapter. Дополнительную информацию можно найти здесь.

Решение 2

Вызовите этот метод вместо adapter.notifyDataSetChanged();

public void refreshList(){
    List<TRListFormat> list = trDb.getAllReminders();
    items = new ArrayList<>();
    for (TRListFormat val : list) {
        HashMap<String, String> map = new HashMap<>();
        map.put("title",val.getTitle());
        map.put("description", val.getDes());
        map.put("date", val.getDate());
        map.put("time", val.getTime());

        items.add(map);
    }

    adapter = new SimpleAdapter(this, items, R.layout.tr_list_format,
      new String[] { "title", "description", "date", "time" },
      new int[] {R.id.tbr_title, R.id.tbr_des, R.id.tbr_date, R.id.tbr_time     });

    lv.setAdapter(adapter);
}
person Rohit5k2    schedule 04.02.2015
comment
Я понял! Мне нужно обновлять его каждый раз, когда я вношу изменения в список, но объявление метода refreshList() как public дает много ошибок cannot resolve the symbol. и если я не объявляю refreshList() общедоступным, он показывает ошибку сразу после refreshList(). ошибка expected ; - person Apurva; 04.02.2015
comment
Вы, должно быть, по ошибке поместили метод внутрь другого метода. Проверь это. - person Rohit5k2; 04.02.2015
comment
ой! решил это. Теперь он обновляет список, но удаляет элемент только из базы данных, а не из listView. удаленный элемент все еще находится в listView - person Apurva; 04.02.2015
comment
Это была моя ошибка. Пожалуйста, смотрите мой отредактированный код. Добавлено items = new ArrayList<>(); - person Rohit5k2; 04.02.2015
comment
если trDb.deleteReminder(new TRListFormat(remId, title, des, date, time)); действительно удаляет напоминание из базы данных, а trDb.getAllReminders(); извлекает обновленные напоминания (после удаления), то мой код будет работать отлично. - person Rohit5k2; 04.02.2015
comment
не могли бы вы помочь мне решить это? stackoverflow.com/questions/28265852/ - person Apurva; 04.02.2015