使用notifyDataSetChanged()帮助刷新列表

时间:2011-03-16 19:14:49

标签: java android arrays list refresh

您好我正在使用一个简单的文件浏览器,它是我的应用程序的一部分,我添加了一些代码来删除文件但是我需要在删除一个项目后刷新文件列表。这是我到目前为止的代码,我在fileList.notifyDataSetChanged();调用的地方添加了注释但是它对我不起作用所以基本上我在这里做错了什么?感谢您的帮助

private void getDir(String dirPath)
{

 item = new ArrayList<String>();
 path = new ArrayList<String>();

 File f = new File(dirPath);
 File[] files = f.listFiles();

 if(!dirPath.equals(root))
 {

  item.add(root);
  path.add(root);

  item.add("../");
  path.add(f.getParent());

 }

 for(int i=0; i < files.length; i++)
 {
   File file = files[i];
   path.add(file.getPath());
   if(file.isDirectory())
    item.add(file.getName() + "/");
   else
    item.add(file.getName());
 }

 ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, R.layout.row, item);
 setListAdapter(fileList); 
}

 @Override
 protected void onListItemClick(ListView l, View v, final int position, long id) {

  final File file = new File(path.get(position));

  if (file.isDirectory())
  {
   if(file.canRead())
    getDir(path.get(position));
   else
   {
    new AlertDialog.Builder(this)
    .setIcon(R.drawable.boot)
    .setTitle("[" + file.getName() + "] folder can't be read!")
    .setPositiveButton("OK", 
      new DialogInterface.OnClickListener() {

       @Override
       public void onClick(DialogInterface dialog, int which) {
       }
      }).show();
   }
  }
  else
  {
        final CharSequence[] items = {"Info", "Rename", "Delete"};

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Options for " + file.getName());
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0)
                {
                    AlertDialog.Builder builder = new AlertDialog.Builder(Installed.this);
                    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
                    builder.setIcon(R.drawable.info)
                           .setTitle(file.getName() + " info")
                           .setMessage("Path: " + file.getPath() + "\n\nSize: " + (double)file.length()/1024 + " mbs" + "\n\nModified: " + sdf.format(file.lastModified()))
                           .setCancelable(false)
                           .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                               public void onClick(DialogInterface dialog, int id) {
                                 dialog.cancel();
                               }
                           }).show();

                }
                else if (item == 1)
                {
                    //TODO Add Rename code here
                    Toast.makeText(Installed.this, "Rename", Toast.LENGTH_SHORT).show();
                }
                else if (item == 2)
                {
                    AlertDialog.Builder builder = new AlertDialog.Builder(Installed.this);
                    builder.setMessage("Are you sure you want to delete " + file.getName() +"?")
                           .setCancelable(false)
                           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                               public void onClick(DialogInterface dialog, int id) { 
                                   File f1 = new File(file.getPath());
                                    boolean success = f1.delete();
                                    if (!success){
                                    Toast.makeText(Installed.this, "Could not delete " + file.getName(), Toast.LENGTH_SHORT).show();  
                                    }else{
                                    Toast.makeText(Installed.this, file.getName() + " deleted!", Toast.LENGTH_SHORT).show();
                                    }
                                    //This is where I try to refresh the list
                                    fileList.notifyDataSetChanged();
                            }
                           })
                           .setNegativeButton("No", new DialogInterface.OnClickListener() {
                               public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                               }
                           }).show();
                }
            }
        }).show();
  }
 }

2 个答案:

答案 0 :(得分:2)

删除item后,请尝试使用fileList.remove(theItemYouDeleted)。这应该会从item中移除Adapter。换句话说,您必须从数据和adapter中删除它。 我希望这有帮助

答案 1 :(得分:1)

为了使其正常工作,您需要修改您为Adapter提供的List,并在调用notifyDataSetChanged()之前删除已删除的文件。

目前您没有从适配器列表中删除数据。

更新

使用此代码创建适配器时。

ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, R.layout.row, item);

事件虽然您删除了文件,但列表(代码中的项目)仍包含有关该文件的数据。您需要从列表中删除该数据才能查看更新。