2012-04-07 10 views
5

Estoy tratando de eliminar los elementos/archivos en una vista de cuadrícula. Los archivos se encuentran en el /data/my-image-folder/. Los archivos se eliminan de una vez, pero la interfaz de usuario no se actualiza al instante. Aquí está mi código para que:Actualizando la vista de cuadrícula Dinámicamente cuando se elimina un elemento (archivo)

imageFilePath = /data/<my-image-folder>/"file.jpg"; 
    File file = new File(imageFilePath); 
    if (file.exists()) { 
    boolean deleted = file.delete(); 
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse(imageFilePath+ Environment.getExternalStorageDirectory()))); 

código getView:

View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View gridView; 

      if (convertView == null) { 

       gridView = new View(context); 

       // get layout from gridlayout.xml 
       gridView = inflater.inflate(R.layout.gridlayout, null); 

       // set value into textview 
       TextView textView = (TextView) gridView 
         .findViewById(R.id.grid_item_label); 
       textView.setText(fileList[position]); 
       System.out.println("value of fileList[position]" + fileList[0]); 
       // set image 
       ImageView imageThumbnail = (ImageView) gridView 
         .findViewById(R.id.grid_item_image); 

       byte[] imageData = null; 
       try { 

        final int THUMBNAIL_SIZE = 64; 

        FileInputStream fis = new FileInputStream(FILE_PATH 
          + fileList[position]); 
        Bitmap imageBitmap = BitmapFactory.decodeStream(fis); 

        Float width = new Float(imageBitmap.getWidth()); 
        Float height = new Float(imageBitmap.getHeight()); 
        Float ratio = width/height; 
        imageBitmap = Bitmap.createScaledBitmap(imageBitmap, 
          (int) (THUMBNAIL_SIZE * ratio), THUMBNAIL_SIZE, 
          false); 

        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
        imageData = baos.toByteArray(); 
        imageThumbnail.setImageBitmap(imageBitmap); 
       } catch (Exception ex) { 

       } 

      } else { 
       gridView = (View) convertView; 
      } 

      return gridView; 
     } 

aquí es mi código de rejilla Ver adaptador:

 ImageAdapter adapter = null; //ImageAdapter extends BaseAdapter 
      if (fileList != null) { 
       adapter = new ImageAdapter(this, fileList); 
       gridView.setAdapter(i); 
      } 

, mientras que después de eliminar si hago:

adapter.notifyDataChanged(); 
grid.invalidateViews(); 

c ompiler se queja de que el adpater como el "final", pero si lo hago "final", se queja de que no puedo hacer adaptador final como que no permitirá que la línea de abajo a suceder:

adapter = new ImageAdapter(this, fileList); 

Por otra parte yo no podía' t encontrar la aplicación notifyDataChanged .Hay notifyDataSetChanged, notificar, notifyAll y notifyDataSetInvalidated pero sin notifyDataChanged.

Creo que Intent.ACTION_MEDIA_MOUNTED es para todas las imágenes/archivos ubicados en la tarjeta SD externa y no para el sistema de archivos del teléfono. Esto es correcto.

¿Cómo puedo lograrlo. Por favor consejo.

Rgds, Softy

Respuesta

10

Usted debe mirar:

adapter.notifyDataSetChanged(); 
grid.invalidateViews(); 

Será notificado el adaptador que algo ha cambiado, y volver a dibujar la cuadrícula ..

Con respecto, ACTION_MEDIA_MOUNTED la documentación dice: Los medios externos están presentes y montados en su punto de montaje. La ruta al punto de montaje para los medios eliminados se encuentra en el campo Intent.mData. El Intento contiene un extra con nombre "de solo lectura" y un valor booleano para indicar si el medio fue montado de solo lectura.

http://developer.android.com/reference/android/content/Intent.html#ACTION_MEDIA_MOUNTED

así que supongo que tienes razón en este

+0

adapter.notifyDataChanged() ;? Lo he visto en la mayoría de las publicaciones SO. ¿Puede definir el adaptador ? Tengo este código: gridView.setAdapter (nuevo ImageAdapter (this, fileList)); en algún lugar en rgds superiores - softy – Raulp

+0

No entiendo exactamente lo que quieres. El adaptador es, de hecho, el enlace entre sus archivos y su vista de cuadrícula, por lo que debe notificar al adaptador cada vez que realice modificaciones en los elementos que se muestran en la vista de cuadrícula. También debe pegar el código relacionado con su adaptador en la publicación. –

+0

Jeremy, actualizó la pregunta y el código de gridview. – Raulp

1

Ok he encontrado la solución: Estoy actualizando la lista de archivos de nuevo, después de la eliminación como esta

File imageFiles = new File(PATH_TO_IMAGES); 

    if (imageFiles.isDirectory()) 
    { 
     fileList = imageFiles.list(); 
    } 

continuación, actualizar la vista de cuadrícula de nuevo con la instancia del adaptador y la lista de archivos como esta ->

gridView.setAdapter(new ImageAdapter(ImageGallary.this, fileList)); 
1

No necesita recrear el adaptador.acaba de hacerlo,

File imageFiles = new File(PATH_TO_IMAGES); 

if(imageFiles.isDirectory()){ 
    fileList.clear() 
    fileList.addAll(imageFiles.list()); 
    adapter.notifyDataSetChanged(); 
} 

Para más información, véase Android: notifyDataSetChanged(); not working

Cuestiones relacionadas