Не може да се използва 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, съжалявам, редактирах грешка във въпроса си   -  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
Разбрах! Трябва да го актуализирам всеки път, когато правя промяна в listview, но декларирането на метода 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