【问题标题】:Cannot use notifyDataSetChanged to update adapter无法使用 notifyDataSetChanged 更新适配器
【发布时间】:2015-02-05 01:44:54
【问题描述】:

删除项目后,我无法更新我的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,并在单击列表视图项时显示三个按钮。

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();
        }
    });

【问题讨论】:

  • 你遇到了什么错误?
  • @ρяσѕρєяK 错误是cannot resolve method 'notifyDataSetChanged()'
  • @Rohit5k2 我已经在类级别定义了适配器(在onCreate() 方法之前)。
  • 是的,它是从评论中的错误声明中得到的。我在帖子 cannot resolve the symbol 中看到了错误,所以我认为这可能是问题所在。
  • 试试adapterView.getAdapter()

标签: android listview adapter


【解决方案1】:

解决方案 1(首选)

notifyDataSetChanged 不适用于 SimpleAdapterSimpleAdapter 用于静态数据。您应该使用不同类型的适配器,例如ArrayAdapter。更多信息是here

解决方案 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);
}

【讨论】:

  • 我明白了!每次在列表视图中进行更改时,我都需要更新它,但是将方法 refreshList() 声明为 public 会产生很多错误 cannot resolve the symbol。如果我不将 refreshList() 声明为 public,它会在 refreshList() 之后显示错误。错误是expected ;
  • 你一定是错误地将方法放入了另一个方法中。检查一下。
  • 哦!解决了。现在它更新列表,但它只从数据库中删除项目,而不是从 listView 中。列表视图中仍然存在已删除的项目
  • 那是我的错误。请查看我编辑的代码。已添加items = new ArrayList&lt;&gt;();
  • 如果trDb.deleteReminder(new TRListFormat(remId, title, des, date, time)); 真的从数据库中删除提醒并且trDb.getAllReminders(); 获取更新的提醒(删除后),那么我的代码将完美运行。
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多