[英]Can't access notifyDataSetChanged
我有一个ListView,我从我的SQLite数据库更新,我已经设置了一个onItemLongClickListener来帮助我通过对话框界面从我的数据库中删除。 但是,即使我使我的适配器全局化,我似乎也无法访问notifyDataSetChanges。
这是我的列表填充函数
private void populateListView() {
Cursor data = mDatabaseHelper.getData();
ArrayList<String> listdata = new ArrayList<>();
while (data.moveToNext()) {
last_date = expire_Date(data.getString(4));
Calendar c = Calendar.getInstance();
c.setTime(last_date);
c.add(Calendar.DATE, 30);
Date currDate = new Date();
SimpleDateFormat dates = new SimpleDateFormat("M/d/yyyy");
currDate.setTime(System.currentTimeMillis());
int differenceDates;
differenceDates = difOfDay(c, currDate);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
month = month+1;
String date = month + "/" + day + "/" + year;
String first_row =data.getString(3) + " (" + data.getString(1) + ")\n";
String second_row = getResources().getString(R.string.red_info);
listdata.add(first_row + " " + second_row + differenceDates + " (" + date + ")");
}
ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,listdata);
mListView.setAdapter(adapter);
}
这是我的删除功能:
public AdapterView.OnItemLongClickListener myClickListener = new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,final int position, final long id) {
AlertDialog alert = new AlertDialog.Builder(view.getContext())
.setTitle("Delete ")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mDatabaseHelper.deletechute(position);
Toast.makeText(getApplicationContext(), "Parachute deleted", Toast.LENGTH_LONG).show();
adapter.notifyDataSetChanged(); ////Here my code can't resolve my adapter///
dialog.dismiss();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
}).show();
return false;
}
};
这首先看起来像一个简单的Java变量范围问题,但也有其他问题,但没有更多的代码很难说。 所以。
adapter
在populateListView
的范围内定义和初始化。 当此方法结束时,将删除引用,并且可以通过垃圾回收删除变量存储区域。
我建议你阅读https://www.java-made-easy.com/variable-scope.html
您可以通过将adapter
定义为Activity类范围内的私有变量来解决此问题,然后它将可用于类中的所有方法。
如果您已修复Problem 1
那么adapter.notifyDataSetChanged();
仍然不会做任何事情。 这是因为当您没有做任何事情来更新List并且无法更新它时,您通知它ArrayList<String> listdata
已更改,因为再次没有可用的listdata
引用,因为它也在本地范围中定义。
这可以通过使listdata
成为您的Activity范围内的私有变量来修复,但这会导致: -
这是一种非常复杂的方法,必须手动保持数据库和列表同步。
使用光标适配器会更好,例如https://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
有关Listviews的游标适配器指南,请访问https://github.com/codepath/android_guides/wiki/Populating-a-ListView-with-a-CursorAdapter
然后在OnClick
方法中,您将更新数据库,并再次获取所有结果的新Cursor,并将旧Cursor交换为旧的,然后是adapter.notifyDataSetChanged();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.