Autore Topic: gridview con numeri  (Letto 643 volte)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
gridview con numeri
« il: 08 Ottobre 2011, 13:14:44 CEST »
0
ho trovato in giro per la rete una guida per fare una gridview con dentro immagine e numeri..
la guida utilizza 9 caselle nella gridview, e funziona benissimo..
io invece devo utilizzare questa guida su una gridview con 100 caselle e non capisco per quale motivo si incasina tutto..
in pratica i numeri delle caselle sono giusti fino alla casella 24 (quelle che si vedono nello schermo senza dover scrollare), ma appena scrollo per andare a vedere quelle successive, i numeri si incasinano tutti..al posto dell'1 ci trovo a volte il 3 , a volte il 20 etc...e comunque i numeri al massimo arrivano a 24 e poi ripartono da 1..
avete idea di come poter risolvere e avere i numeri stabili fino a 100 anche se si scrolla?
vi metto il codice della guida fino a 9 caselle:
Codice (Java): [Seleziona]
public class ImageAdapter extends BaseAdapter
{
Context MyContext;

public ImageAdapter(Context _MyContext)
{
        MyContext = _MyContext;
}

public int getCount()
{
        return 9;
}

public View getView(int position, View convertView, ViewGroup parent)
{
        View MyView = convertView;
       
        if ( convertView == null )
        {
                LayoutInflater li = getLayoutInflater();
                MyView = li.inflate(R.layout.grid_item, null);
               
                TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);
                tv.setText( ""+position );
               
                ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
                iv.setImageResource(R.drawable.cappello);
        }
       
        return MyView;
}



public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
}

public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
}
questo invece e' il codice del layout grid_item:
Codice (XML): [Seleziona]
        <ImageView
                android:id="@+id/grid_item_image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
        </ImageView>
       
        <TextView
                android:id="@+id/grid_item_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:gravity="center_horizontal"
                android:textColor="#FFFFFF">
        </TextView>
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:gridview con numeri
« Risposta #1 il: 08 Ottobre 2011, 14:26:29 CEST »
+1
si chiama riciclo delle view. Se la convert view == null come fai giustamente prendi e crei gli elementi.
ma se è diverso da null, allora stai riciclando la view e devi rifare il setText(position).
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:gridview con numeri
« Risposta #2 il: 08 Ottobre 2011, 21:28:13 CEST »
0
grazie mille per la risposta..
ma non sono molto pratico con gli else :( ho fatto alcune prove e penso di aver risolto, ma per sicurezze puoi dirmi se ho fatto bene in questo modo?
Codice (Java): [Seleziona]
public class ImageAdapter extends BaseAdapter
{
Context MyContext;

public ImageAdapter(Context _MyContext)
{
        MyContext = _MyContext;
}

public int getCount()
{
        return 100;
}

public View getView(int position, View convertView, ViewGroup parent)
{
        View MyView = convertView;
       
        if ( convertView == null )
        {
                LayoutInflater li = getLayoutInflater();
                MyView = li.inflate(R.layout.grid_item, null);
               
                TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);
                tv.setText( ""+position );
               
                ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
                iv.setImageResource(R.drawable.cappello);
        }
        else {
                LayoutInflater li = getLayoutInflater();
                MyView = li.inflate(R.layout.grid_item, null);         
               
                TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);
                tv.setText( ""+position );
               
                ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
                iv.setImageResource(R.drawable.cappello);
        }
        return MyView;
}      
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline denix_80

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: +1
    • Mostra profilo
Re:gridview con numeri
« Risposta #3 il: 11 Ottobre 2011, 10:17:36 CEST »
+1
Con quel ciclo "if - else" che hai messo nell'ultimo post non fai niente di più che duplicare il codice. Tanto vale non metterlo. Il riciclo dei componenti di serve per non dissanguare le risorse. Hai provato con
Codice (Java): [Seleziona]
 
public int getCount()
{
        return 100;
}

public View getView(int position, View convertView, ViewGroup parent)
{
        View MyView = convertView;
       
        if ( convertView == null )
        {
                LayoutInflater li = getLayoutInflater();
                MyView = li.inflate(R.layout.grid_item, null);
               
                TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);
                tv.setText( ""+position );
               
                ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
                iv.setImageResource(R.drawable.cappello);
        }
       
        return MyView;
}

in questo caso la visualizzazione non è però suddiviso in pagine, ma avresti una griglia da 'scrollare'. Se invege vuoi utilizzare una visualizzazione paginata allora andrei più su una soluzione sel tipo
Codice (Java): [Seleziona]
public int getCount()
{
        return 9;
}

public View getView(int position, View convertView, ViewGroup parent)
{
        View MyView = convertView;
        LayoutInflater li = getLayoutInflater();
        MyView = li.inflate(R.layout.grid_item, null);
        TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);
        tv.setText( ""+position );
        ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
        iv.setImageResource(R.drawable.cappello);
        return MyView;
}

Per poi gestire gli indici corretti dovrei usare un indice di pagina che deve essere gestita dall'activity principale. In questo modo con l'indice della griglia e il numero di pagina riesci a governare l'evento sull'elemento selezionato

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:gridview con numeri
« Risposta #4 il: 11 Ottobre 2011, 13:51:07 CEST »
0
ciao denix, il tuo primo esempio e' esattamente quello che ho postato io a inizio pagina, quindi i motivi per cui non funziona li puoi vedere li..
invece il secondo esempio(che e' identico al primo ma senza 'if ( convertView == null )  funziona perfettamente..
non capisco il motivo, ma togliendo:
if ( convertView == null )
i numeri funzionano bene e non si incasinano..
in ogni caso ho usato quell'else per fare in modo che i numeri non si incasinassero, per questo ho messo la copia esatta di if..se qualcuno mi sa dire come avrei mettere l'else in modo esatto, mi farebbe un grosso favore ^^
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!