Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过长时间单击删除项目后,Listview不会刷新自身?_Android - Fatal编程技术网

Android 通过长时间单击删除项目后,Listview不会刷新自身?

Android 通过长时间单击删除项目后,Listview不会刷新自身?,android,Android,我使用自定义SimpleCursorAdapter填充了listview。在listview的Listener上打开另一个活动,即它的working。现在,我想显示一个警告对话框,其中有“是”,没有删除文件的选项。选择“是”后,我将获取光标并获取项目的相关数据库条目,删除该条目,并从应用程序数据目录中删除文件,但listview在关闭应用程序并重新打开它之前不会刷新自身。在longclick侦听器中删除文件和db条目后,我尝试使用adapter.changeCursor(游标),但没有成功。在删

我使用自定义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。