Android 通过长时间单击删除项目后,Listview不会刷新自身?
我使用自定义SimpleCursorAdapter填充了listview。在listview的Listener上打开另一个活动,即它的working。现在,我想显示一个警告对话框,其中有“是”,没有删除文件的选项。选择“是”后,我将获取光标并获取项目的相关数据库条目,删除该条目,并从应用程序数据目录中删除文件,但listview在关闭应用程序并重新打开它之前不会刷新自身。在longclick侦听器中删除文件和db条目后,我尝试使用adapter.changeCursor(游标),但没有成功。在删除文件和数据库条目后,我需要做什么才能使其立即刷新 主要活动:Android 通过长时间单击删除项目后,Listview不会刷新自身?,android,Android,我使用自定义SimpleCursorAdapter填充了listview。在listview的Listener上打开另一个活动,即它的working。现在,我想显示一个警告对话框,其中有“是”,没有删除文件的选项。选择“是”后,我将获取光标并获取项目的相关数据库条目,删除该条目,并从应用程序数据目录中删除文件,但listview在关闭应用程序并重新打开它之前不会刷新自身。在longclick侦听器中删除文件和db条目后,我尝试使用adapter.changeCursor(游标),但没有成功。在删
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long l) {
cursor = (Cursor) lv.getAdapter().getItem(position);
filepath = cursor.getString(cursor.getColumnIndex("filename"));
final File file = new File(filepath);
builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Delete File");
builder.setMessage("Are you sure you want to delete this file?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
boolean isDeleted = file.delete();
int count = db.delteSingleEntry(filepath);
if (isDeleted && count != 0){
Toast.makeText(MainActivity.this, "File deleted and Database entry removed", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
adapter.changeCursor(cursor);
return false;
}
});
}
lv.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView AdapterView,视图视图,最终整型位置,长l){
游标=(游标)lv.getAdapter().getItem(位置);
filepath=cursor.getString(cursor.getColumnIndex(“文件名”);
最终文件=新文件(文件路径);
builder=新建AlertDialog.builder(MainActivity.this);
builder.setTitle(“删除文件”);
setMessage(“确实要删除此文件吗?”);
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
布尔值isDeleted=file.delete();
int count=db.delteSingleEntry(文件路径);
如果(isDeleted&&count!=0){
Toast.makeText(MainActivity.this,“删除文件并删除数据库条目”,Toast.LENGTH_SHORT.show();
}否则{
Toast.makeText(MainActivity.this,“Error”,Toast.LENGTH_SHORT.show();
}
}
})
.setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
dialogInterface.cancel();
}
});
AlertDialog alert=builder.create();
alert.show();
adapter.changeCursor(游标);
返回false;
}
});
}
您需要拨打:
yourAdapter.notifyDataSetChanged()
但为了获得更好的性能,请尝试使用Recyclerview实例
当基础数据发生更改时,您需要通知数据观察者和任何ui(如listview或recyclerview)刷新自身,这可以通过使用
BaseAdapter.notifydatasetchanged()
方法
由于游标适配器是BaseAdapter的子类,所以也可以对适配器使用此方法
我让它工作了。我在delete语句之后调用了populatelistview()方法,它立即更新了listview。谢谢大家
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long l) {
cursor = (Cursor) lv.getAdapter().getItem(position);
filepath = cursor.getString(cursor.getColumnIndex("filename"));
final File file = new File(filepath);
builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Delete File");
builder.setMessage("Are you sure you want to delete this file?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
boolean isDeleted = file.delete();
int count = db.delteSingleEntry(filepath);
if (isDeleted && count != 0){
populateListview(); //I added this line and problem resolved.
Toast.makeText(MainActivity.this, "File deleted and Database entry removed", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
return true;
}
});
lv.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView AdapterView,视图视图,最终整型位置,长l){
游标=(游标)lv.getAdapter().getItem(位置);
filepath=cursor.getString(cursor.getColumnIndex(“文件名”);
最终文件=新文件(文件路径);
builder=新建AlertDialog.builder(MainActivity.this);
builder.setTitle(“删除文件”);
setMessage(“确实要删除此文件吗?”);
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
布尔值isDeleted=file.delete();
int count=db.delteSingleEntry(文件路径);
如果(isDeleted&&count!=0){
populateListview();//我添加了这一行并解决了问题。
Toast.makeText(MainActivity.this,“删除文件并删除数据库条目”,Toast.LENGTH_SHORT.show();
}否则{
Toast.makeText(MainActivity.this,“Error”,Toast.LENGTH_SHORT.show();
}
}
})
.setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
dialogInterface.cancel();
}
});
AlertDialog alert=builder.create();
alert.show();
返回true;
}
});
random aspirer,我试图将adapter.notifydatasetchanged()放在alert.show()之后和if(isDeleted&&count!=0)之后{但它不起作用。请注意我的代码,告诉我应该将adapter.notifydatasetchanged()语句放在哪里?我让它起作用了。我调用了我的populatelistview()方法,并立即更新listview.Thanx random aspirer。