2012-04-07 15 views
5

Próbuję usunąć elementy/pliki w widoku siatki. Pliki znajdują się w /data/my-image-folder/. Pliki są usuwane jednocześnie, ale interfejs użytkownika nie jest natychmiast aktualizowany. Tu jest mój kod, który:Aktualizowanie widoku siatki Dynamicznie po usunięciu elementu (pliku)

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

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

tutaj jest mój kod do siatki Widok adaptera:

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

natomiast po usunięciu jeśli robię:

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

c ompiler narzeka aby złączami pośrednimi jako „ostateczny”, ale jeśli zrobię to „ostateczne”, narzeka, że ​​nie mogę zrobić adapter końcowy, gdyż nie pozwoli poniżej linii wydarzy:

adapter = new ImageAdapter(this, fileList); 

Ponadto nie mogłem” t znaleźć implementacja notifyDataChanged .There jest notifyDataSetChanged, zawiadomić, notifyAll i notifyDataSetInvalidated ale nie notifyDataChanged.

Myślę, że Intent.ACTION_MEDIA_MOUNTED dotyczy wszystkich zdjęć/plików znajdujących się na zewnętrznej karcie SD, a nie systemu plików telefonu. Poprawnie.

Jak mogę to osiągnąć. Porada Plza.

Rgds, softy

Odpowiedz

10

Należy spojrzeć na:

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

Będzie powiadomiony adapter że coś się zmieniło, i od nowa siatkę ..

chodzi, ACTION_MEDIA_MOUNTED dokumentacja mówi: Zewnętrzne media są obecne i zamontowane w punkcie montowania. Ścieżka do punktu instalacji dla usuniętego nośnika znajduje się w polu Intent.mData. Intent zawiera dodatkowe z nazwą "tylko do odczytu" i wartością logiczną, aby wskazać, czy nośnik był podłączony tylko do odczytu.

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

Więc myślę, że masz rację w tej sprawie

+0

adapter.notifyDataChanged() ;? Widziałem to na większości postów SO. Czy możesz zdefiniować adapter . Mam ten kod: gridView.setAdapter (nowy ImageAdapter (this, fileList)); gdzieś na górze rgds - softy – Raulp

+0

Nie rozumiem dokładnie tego, co chcesz. Adapter jest w rzeczywistości łączem między twoimi plikami a widokiem gridowym, więc musisz powiadamiać adapter za każdym razem, gdy dokonujesz modyfikacji elementów wyświetlanych w widoku siatki. Powinieneś również wkleić kod dotyczący adaptera. –

+0

Jeremy, zaktualizował pytanie i kod gridview. – Raulp

1

Ok znalazłem rozwiązanie: jestem ponownie aktualizację FileList, po usunięciu jak ten

File imageFiles = new File(PATH_TO_IMAGES); 

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

następnie aktualizowanie gridview ponownie z instancją adaptera i taką listą filarów ->

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

Nie trzeba ponownie tworzyć adaptera.po prostu zrobić,

File imageFiles = new File(PATH_TO_IMAGES); 

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

uzyskać więcej zobacz Android: notifyDataSetChanged(); not working

Powiązane problemy