Помогите обновить список с помощью notifyDataSetChanged () - PullRequest
2 голосов
/ 16 марта 2011

Привет, я работаю над простым файловым браузером, который является частью моего приложения, и я добавил некоторый код для удаления файлов, однако мне нужно обновить список файлов после удаления одного элемента. Это код, который у меня есть до сих пор, и я добавил комментарий, где я звоню на 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 ]

2 голосов
/ 16 марта 2011

После удаления item попробуйте использовать fileList.remove(theItemYouDeleted). Это должно удалить item из Adapter. Другими словами, вы должны удалить его из ваших данных и из вашего adapter. Я надеюсь, что это помогает

1 голос
/ 16 марта 2011

Для того, чтобы это работало правильно, вам нужно изменить список, который вы предоставляете адаптеру, и удалить удаленный файл перед вызовом notifyDataSetChanged ().

В настоящее время вы не удаляете данные из адаптераlist.

Обновление:

Когда вы создаете адаптер с этим кодом.

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

событие, хотя вы удалили файл, список (элемент в коде),по-прежнему содержит данные о файле.Вам нужно будет удалить эти данные из списка, чтобы увидеть обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...