SimpleAdapter notifyDataSetChanged

时间:2014-01-30 10:14:18

标签: android listview

每当我删除其上的项目时,我都会尝试刷新ListView。但是设置notifyDataSetChanged();会给我这个错误:

不能引用内部类中的非final变量适配器    用不同的方法定义。

方法notifyDataSetChanged()未定义类型    ListAdapter。

ArrayList <HashMap <String, String> > data = dataHolder.getAllData();
dataHolder.getAllData();

if(data.size() !=0){

ListView lv = (ListView) findViewById(R.id.datalist);
ListAdapter adapter = new SimpleAdapter(MainActivity.this, data, R.layout.dataentry, new String[]{"unique_id","lastName"}, new int[]{R.id.unique_id,R.id.last_name});
lv.setAdapter(adapter);
lv.setOnItemLongClickListener(new OnItemLongClickListener() {

                @Override
                public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
                    adb.setTitle("Delete?");
                    adb.setIcon(android.R.drawable.ic_dialog_alert);
                    adb.setMessage("Delete selected item?");
                    adb.setCancelable(false);
                    adb.setNegativeButton("Cancel", null);
                    adb.setPositiveButton("Delete", new AlertDialog.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {

                        TextView uID = (TextView) findViewById(R.id.unique_id);
                        String unique_id = uID.getText().toString();
                        dataHolder.deleteData(unique_id);
                        adapter.notifyDataSetChanged();
                    }
                });  
                adb.show();
                return false;
                }
            });
}

然后它建议将其更改为:

((BaseAdapter) adapter).notifyDataSetChanged();

final ListAdapter adapter = new SimpleAdapter(MainActivity.this, data, R.layout.dataentry, new String[]{"unique_id","lastName"}, new int[]{R.id.unique_id,R.id.last_name});

但改变之后,它并没有刷新清单。解决方案是什么?

4 个答案:

答案 0 :(得分:3)

adapteryou need it to be final中引用AlertDialog.OnClickListener(这基本上就是错误告诉您的内容)。所以只需声明final

final BaseAdapter adapter = new SimpleAdapter(MainActivity.this, data, R.layout.dataentry, new String[]{"unique_id","lastName"}, new int[]{R.id.unique_id,R.id.last_name});

您也可以从调用的参数中获取它:

@Override
public boolean onItemLongClick(final AdapterView<?> adapterView, View arg1, int arg2, long arg3) {
    // ...
    final Adapter adapter = adapterView.getAdapter();
    if (adapter instanceof BaseAdapter) {
        ((BaseAdapter)adapter).notifyDataSetChanged();
    } else {
        throw new RuntimeException("Unexpected adapter");
    }

例如。

答案 1 :(得分:1)

使适配器成为类的字段而不是局部变量。 此外,不要使用ListAdapter接口声明它,而是使用您需要使用的方法的真实类,因此您不需要强制转换,例如

 BaseAdapter adapter = new SimpleAdapter(....

还要...请注意您的适配器的数据收集在data,并且您要从dataHolder删除该项目,我不知道它是什么。请检查data更改时实际dataHolder是否正在更改,否则列表不会更改。

我认为这是问题所在。当您致电notifyDataSetChanged()时,它会检查数据是否已更改。可能它没有,并且适配器不知道如何从dataHolder再次获取它。这就是为什么它不起作用。你应该传递一个时,DataHolder内改变一个变量,或者创建自己的adatper接收dataholder数据和呼叫getAllData()检索时,notifyDataSetChanged()被称为更新。

其他更简单的方法是在public ArrayList <HashMap <String, String> > data中创建dataHolder。当您致电data或向deleteData插入数据时,dataHodler会被修改。那个dataHolder.data就是你在构造函数中传递给适配器的东西:

new SimpleAdapter(MainActivity.this, dataHolder.data, R.layout.dataentry, new String[]{"unique_id","lastName"}, new int[]{R.id.unique_id,R.id.last_name});

答案 2 :(得分:0)

找到解决方案。必须先从列表视图的数组列表中删除该项,然后才能通知更改的数据集。

data.remove(position);
adapter.notifyDataSetChanged();

答案 3 :(得分:-1)

只需将ListAdapter声明为全局变量