2012-04-07 10 views
5

Sto tentando di eliminare gli elementi/file in una vista a griglia. I file si trovano nello /data/my-image-folder/. I file vengono eliminati contemporaneamente ma l'interfaccia utente non viene aggiornata all'istante. Ecco il mio codice per questo:Aggiornamento dinamico della vista griglia quando viene eliminato un elemento (file)

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()))); 

codice 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; 
     } 

Ecco il mio codice per la griglia Visualizza adattatore:

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

mentre dopo l'eliminazione se faccio:

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

c ompiler lamenta per rendere l'adpater come la "finale", ma se ce la faccio "finale", si lamenta che non posso fare adattatore finale in quanto non permetterà la linea qui sotto per accadere:

adapter = new ImageAdapter(this, fileList); 

Inoltre non potevo' t trovare l'attuazione notifyDataChanged .C'è notifyDataSetChanged, notificare, notifyAll e notifyDataSetInvalidated ma nessuno notifyDataChanged.

Penso che Intent.ACTION_MEDIA_MOUNTED sia per tutte le immagini/file che si trovano sulla scheda SD esterna e non per il file system del telefono. È corretto.

Come posso ottenerlo. Consiglio Plz.

Rgds, Softy

risposta

10

Si dovrebbe guardare:

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

Sarà notificato al adattatore che qualcosa è cambiato, e ridisegnare la griglia ..

Per quanto riguarda, ACTION_MEDIA_MOUNTED la documentazione dice: Il supporto esterno è presente e montato nel punto di montaggio. Il percorso del punto di montaggio per il supporto rimosso è contenuto nel campo Intent.mData. L'intento contiene un extra con il nome "read-only" e il valore booleano per indicare se il supporto è stato montato in sola lettura.

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

Quindi credo che tu abbia ragione su questo

+0

adapter.notifyDataChanged() ;? Ho visto questo sulla maggior parte dei post SO. Si può definire l'adattatore . Ho questo codice: gridView.setAdapter (nuovo ImageAdapter (this, fileList)); da qualche parte in cima rgds - softy – Raulp

+0

Non capisco esattamente quello che vuoi. L'adattatore è infatti il ​​collegamento tra i tuoi file e il tuo gridview, quindi devi notificare l'adattatore ogni volta che fai delle modifiche sugli elementi visualizzati nella griglia. Dovresti incollare anche il codice relativo all'adattatore nel post. –

+0

Jeremy, ha aggiornato la domanda e il codice della griglia. – Raulp

1

Ok ho trovato la soluzione: sto aggiornando nuovamente il fileList, dopo la cancellazione come questo

File imageFiles = new File(PATH_TO_IMAGES); 

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

poi l'aggiornamento nuovamente il gridview con l'istanza dell'adapter e la filelist come questa ->

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

Non è necessario ricreare l'adattatore.basta fare così,

File imageFiles = new File(PATH_TO_IMAGES); 

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

Per ulteriori vedere Android: notifyDataSetChanged(); not working

Problemi correlati