Autore Topic: Evidenziare le immagini di una gallery  (Letto 929 volte)

Offline Miccar

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus, Motorola Milestone
Evidenziare le immagini di una gallery
« il: 18 Giugno 2010, 10:30:20 CEST »
0
Salve a tutti!

Vi pongo una domanda la cui soluzione immagino sia piuttosto semplice, eppure non riesco proprio a venirne a capo :)
Ho una Gallery realizzata nel classico metodo (come da esempio Hello Gallery della documentazione ufficiale : http://developer.android.com/resources/tutorials/views/hello-gallery.html con l'unica differenza che visualizza le immagini presenti nella sd e non quelle inserite come risorse).
Nella mia applicazione utilizzo tale gallery come meccanismo di selezione di due o piu' immagini che verranno successivamente elaborate.
Attualmente, quando clicco su una delle immagini, l'indirizzo al quale trovare l'immagine viene aggiunto ad un ArrayList<String>.
Alla fine della selezione quindi, avro' un arraylist di stringhe contenente tutti gli indirizzi delle immagini che dovranno essere elaborate.

Funziona tutto bene, il problema e' che volevo in qualche modo rendere evidente visivamente per ogni singola immagine della Gallery, se essa fosse stata selezionata o meno.

Il mio primo tentativo e' stato un semplice:

Codice (Java): [Seleziona]
final Gallery g = (Gallery) findViewById(R.id.Gallery01);
g.setAdapter(new ImageAdapter(this.getApplicationContext()));
g.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
              cursor2.moveToPosition(position);
              if (immagini_selezionate.contains(cursor2.getString(columnIndex))){
                   immagini_selezionate.remove(immagini_selezionate.indexOf(cursor2.getString(columnIndex)));
                   v.setBackgroundColor(Color.TRANSPARENT);
              } else {
                   immagini_selezionate.add(cursor2.getString(columnIndex));
                   v.setBackgroundColor(Color.GRAY);
              }
       }
});            

Praticamente quando clicco su una immagine, il colore di background della view della gallery relativa all'immagine cliccata viene settato di colore diverso. Questo espediente sul momento funziona.. Il problema si verifica quando scorro la gallery (nascondendo temporaneamente la view selezionata):  appena torno a visualizzarla, ha perso il colore diverso di background. Immagino dipenda dal fatto che appena una immagine viene "nascosta", viene temporaneamente eliminata dalla memoria e quando torna ad essere visualizzata, viene nuovamente ricreata (perdendo cosi' le impostazioni settate dall'evento click).

Per provare a risolvere ho modificato il getView dell'Adapter nel seguente modo:

Codice (Java): [Seleziona]
public class ImageAdapter extends BaseAdapter {
        [...]
        public View getView(int position, View convertView, ViewGroup parent) {
                final ImageView i;
                if (convertView == null) {
                        i = new ImageView(mContext);
                } else {
                        i = (ImageView) convertView;
                }
                cursor.moveToPosition(position);
                cursor2.moveToPosition(position);
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Thumbnails._ID));
                i.setImageURI(Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,id+""));
                i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                i.setLayoutParams(new Gallery.LayoutParams(136, 88));
                i.setPadding(8, 8, 8, 8);
                if (immagini_selezionate.contains(cursor2.getString(columnIndex))){
                        i.setBackgroundColor(Color.GRAY);
                } else {
                        i.setBackgroundColor(Color.TRANSPARENT);
                }
                return i;
        }
}

Quindi, ogni volta che viene chiamato il getView, se l'immagine si trova nell'array delle immagini selezionate, allora viene impostato il colore di sfondo.
Ancora una volta, questo espediente in effetti funziona.. Ma rimane un problema!
Quando vado a svuotare il mio array di immagini selezionate, in ogni caso la gallery non si aggiorna automaticamente se non dopo che scorro (nascondo volontariamente) le immagini selezionate e le rimostro..

La domanda quindi e': Come posso forzare un refresh della gallery? (come posso insomma fare in modo che, appena svuoto l'array contenente le immagini selezionate, venga anche forzato un redraw della gallery?)

Domanda supplementare: Mi consigliate un metodo piu' carino per evidenziare nella gallery le immagini selezionate? :D
« Ultima modifica: 18 Giugno 2010, 10:40:14 CEST da Miccar »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Evidenziare le immagini di una gallery
« Risposta #1 il: 18 Giugno 2010, 12:35:39 CEST »
0
hai provato il metodo invalidateViews() sulla gridview?




Offline Miccar

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus, Motorola Milestone
Re:Evidenziare le immagini di una gallery
« Risposta #2 il: 18 Giugno 2010, 13:53:30 CEST »
0
hai provato il metodo invalidateViews() sulla gridview?

Non ho una gridview ma una gallery.. e non riesco a trovare il metodo invalidateViews() per la gallery.. Ho provato con invalidate() ma non succede nulla..
Invece sembra funzionare il metodo: notifyDataSetChanged(); chiamato sulla ImageView sull' ImageAdapter (l'adapter). Questo pero' mi costringe a dichiarare l'adapter come variabile globale:

Codice (Java): [Seleziona]
private ImageAdapter ia;

@Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
               
          setContentView(R.layout.scrollable_image);
          ia=new ImageAdapter(this.getApplicationContext());
          final Gallery g = (Gallery) findViewById(R.id.Gallery01);
          g.setAdapter(ia);
[...]
}

al posto di:
Codice (Java): [Seleziona]
@Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
               
          setContentView(R.layout.scrollable_image);
          final Gallery g = (Gallery) findViewById(R.id.Gallery01);
          g.setAdapter(new ImageAdapter(this.getApplicationContext()));
[...]
}

e questa dichiarazione di variabile globale non so se mi dara' problemi di memoria (non ho ancora ben chiaro come funziona.. probabilmente e' una enorme fesseria quella che sto dicendo.. l'unica cosa che ho capito e' che l'elaborazione delle immagini mi da MOLTI problemi di memoria su android per cui provo ad andare sempre coi piedi di piombo :D )
« Ultima modifica: 18 Giugno 2010, 14:00:59 CEST da Miccar »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Evidenziare le immagini di una gallery
« Risposta #3 il: 18 Giugno 2010, 14:25:01 CEST »
0
sorry, ho fatto confusione con la gridview... per quanto riguarda dichiarare un oggetto a livello di classe non dovrebbe essere un problema per la memoria.
in quanto, quando e se questo, non sarà piu utilizzato, il gc si occuperà di distruggerlo.

in ogni caso qui g.setAdapter(new ImageAdapter(this.getApplicationContext())); allochi memoria per quell'oggetto... solo che non ne hai il riferimento.

Offline Miccar

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus, Motorola Milestone
Re:Evidenziare le immagini di una gallery
« Risposta #4 il: 18 Giugno 2010, 22:39:13 CEST »
0
in ogni caso qui g.setAdapter(new ImageAdapter(this.getApplicationContext())); allochi memoria per quell'oggetto... solo che non ne hai il riferimento.

Si, infatti.. Non dovrebbe cambiare nulla..
Grazie :) Segno come risolto!