每当我删除其上的项目时,我都会尝试刷新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});
但改变之后,它并没有刷新清单。解决方案是什么?
答案 0 :(得分:3)
从adapter
,you 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声明为全局变量