2012-04-07 10 views
5

Ich versuche, die Elemente/Dateien in einer Rasteransicht zu löschen. Die Dateien befinden sich in der /data/my-image-folder/. Die Dateien werden sofort gelöscht, aber die Benutzeroberfläche wird nicht sofort aktualisiert. Hier ist mein Code dafür:Aktualisieren der Rasteransicht Dynamisch, wenn ein Element (Datei) gelöscht wird

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

GetView Code:

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

hier ist mein Code für die Netzansicht Adapter:

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

während nach dem Löschen, wenn ich tun:

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

c ompiler klagt die Adpater als „endgültig“ zu machen, aber wenn ich es „endgültig“, es beschwert sich, dass ich Adapter endgültig machen kann nicht, da es nicht die unter der Linie passieren lassen:

adapter = new ImageAdapter(this, fileList); 

Außerdem I couldn‘ t finden die Umsetzung notifyDataChanged .Es ist notifyDataSetChanged, benachrichtigen, notifyAll und notifyDataSetInvalidated aber keine notifyDataChanged.

Ich denke, Intent.ACTION_MEDIA_MOUNTED ist für alle Bilder/Dateien auf der externen SD-Karte und nicht für das Telefon-Dateisystem. Das ist richtig.

Wie kann ich es erreichen? Plz Beratung.

Rgds, Softy

Antwort

10

sollten Sie schauen auf:

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

Es den Adapter benachrichtigt wird, dass sich etwas verändert und neu zeichnen das Gitter ..

Bezüglich ACTION_MEDIA_MOUNTED die Dokumentation sagt: Externes Medium ist vorhanden und an seinem Mount-Punkt montiert. Der Pfad zum Mount-Punkt für das entfernte Medium ist im Feld Intent.mData enthalten. Die Absicht enthält ein Extra mit dem Namen "Nur-Lesen" und einem booleschen Wert, um anzuzeigen, ob der Datenträger schreibgeschützt wurde.

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

Also ich denke, du hast Recht auf diesem

+0

adapter.notifyDataChanged() sehen ;? Ich habe das auf den meisten SO-Posts gesehen. Sie können den Adapter definieren. Ich habe diesen Code: gridView.setAdapter (new ImageAdapter (this, fileList)); irgendwo oben rgds - softy – Raulp

+0

Ich verstehe nicht genau, was Sie wollen. Der Adapter ist eigentlich die Verbindung zwischen Ihren Dateien und Ihrer Gridview, so dass Sie den Adapter jedes Mal benachrichtigen müssen, wenn Sie Änderungen an den in der Gridview angezeigten Elementen vornehmen. Sie sollten den Code für Ihren Adapter auch in die Post einfügen. –

+0

Jeremy, aktualisierte die Frage und den Gridview-Code. – Raulp

1

Ok fand ich die Lösung: Ich bin die Dateiliste zu aktualisieren wieder, nach dem Löschen wie diese

File imageFiles = new File(PATH_TO_IMAGES); 

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

dann die Aktualisierung die Gridview erneut mit der Adapter-Instanz und der Dateiliste wie folgt ->

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

Sie müssen den Adapter nicht neu erstellen.nur tun so,

File imageFiles = new File(PATH_TO_IMAGES); 

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

Weitere Android: notifyDataSetChanged(); not working

Verwandte Themen