Autore Topic: Listview in pagine non funzionante  (Letto 801 volte)

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Listview in pagine non funzionante
« il: 05 Settembre 2011, 11:06:57 CEST »
0
Ciao a tutti
Sto cercando di realizzare una listview suddivisa in pagine.Lo scorrimento delle pagine viene fatto tramite due pulsanti(avanti e indietro)
La listview visualizza 5 risultati per pagina.
Finora sono riuscito a visualizzare correttamente la prima pagina.Il problema è che premendo sul pulsante avanti, la lista cambia , ma gli elementi che vengono visualizzati sono gli stessi di quelli visualizzati nella pagina precedente.
Se per esempio la ricerca mi dà 7 risultati, nella prima pagina vengono visualizzati i primi 5, nella seconda pagina vengono visualizzati i restanti 2,che sono uguali ai primi due visualizzati nella prima pagina.
Ora vi spiego un pò a livello di codice come ho realizzato il tutto.
Innanzitutto ho creato una classe custom adapter per la realizzazione di un layout personalizzato.Questo perchè in ogni riga viene visualizzata un' icona (con un immagine che si differenzia a seconda della categoria dell'elemento), e due stringhe di testo.
Dopodiche richiamando il metodo aggiornaLista() viene visualizzata la nuova pagina
Eccovi il codice:

Classe MyCustomAdapter:
Codice (Java): [Seleziona]
public class MyCustomAdapter extends ArrayAdapter<String> {

                public MyCustomAdapter(Context context, int textViewResourceId,
                String[] objects) {
                super(context, textViewResourceId, objects);
                // TODO Auto-generated constructor stub
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                //return super.getView(position, convertView, parent);
                LayoutInflater inflater=getLayoutInflater();
                View row=inflater.inflate(R.layout.row, parent, false);
                TextView label=(TextView)row.findViewById(R.id.punto);
                label.setText(poilist[position]);
                ImageView icon=(ImageView)row.findViewById(R.id.icon);
                if (poi[position][1].equals("Bar")){
                icon.setImageResource(R.drawable.bar);
                }
                else if(poi[position][1].equals("Museo")){
                        icon.setImageResource(R.drawable.museo);
                        }
                else if(poi[position][1].equals("Cinema")){
                        icon.setImageResource(R.drawable.cinema);
                        }
                else if(poi[position][1].equals("Ristorante")){
                        icon.setImageResource(R.drawable.ristorante);
                        }
                else if(poi[position][1].equals("Shopping")){
                        icon.setImageResource(R.drawable.shopping);
                        }
               
               

                return row;
                }
}


Metodo aggiornaLista

Codice (Java): [Seleziona]
private void aggiornaLista(int indinizio)
{
        if (indinizio<0)
                indinizio=0;
        else if (indinizio >= poilist.length)
                indinizio -= NUMERO_POI_PAGINA;
       
        arrayinizio=indinizio;
       
        int indfine = indinizio + NUMERO_POI_PAGINA;
       
        if (indfine > poilist.length)
                indfine=poilist.length;
        String[] subNome=null;
       
         subNome = prelevaPoi(indinizio,indfine);

        setListAdapter(new MyCustomAdapter(ListaPOI.this, R.layout.row, subNome));
}

private String[] prelevaPoi(int indinizio, int indfine){

         String[] poiPagina = new String[indfine - indinizio];

         int index = -1;
         for(int x = indinizio; x < indfine; x++)
          poiPagina[++index] = poilist[x];

         return poiPagina;
        }

Evento click dei pulsanti

Codice (Java): [Seleziona]
public void onClick(View v)
{
        if(v == bottonefw) //Pulsante avanti
                aggiornaLista(arrayinizio + NUMERO_POI_PAGINA);  //NUMERO_POI_PAGINA = 5
       
        else if (v == bottonebw) //Pulsante indietro
                aggiornaLista(arrayinizio - NUMERO_POI_PAGINA);
               
}

Quando viene eseguita l'activity la variabile arrayinizio vale 0 e viene richiamato il metodo aggiornaLista(0) nell' onCreate(); dopodichè l'indice si incrementa e la lista dovrebbe visualizzare gli altri elementi. ma non lo fa.
Qualcuno a qualche idea su come rimediare?

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #1 il: 05 Settembre 2011, 12:45:26 CEST »
0
ciao, purtroppo non ho la soluzione perchè anche io sto cercando di fare la tua stessa cosa  :-P
Volevo chiederti come fossi riuscito a mettere i due bottoni in fondo alla lista di oggetti. Lo hai fatto tramite layout? Ti dispiacerebbe dirmi come?
Sono giorni che provo senza riuscirc

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Listview in pagine non funzionante
« Risposta #2 il: 05 Settembre 2011, 15:25:32 CEST »
0
Si l'ho fatto tramite xml.

Ti posto il codice:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                >
               
         <ListView
                android:id="@android:id/list"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawSelectorOnTop="false"
                />
               
        <Button android:text="Indietro"
                android:id="@+id/bottoneInd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@android:id/list">
         </Button>     
         <Button android:text="Avanti"
                android:id="@+id/bottoneAva"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@android:id/list"
                android:layout_toRightOf="@id/bottoneInd">
         </Button>     

       
</RelativeLayout>

Nell'activity, quando crei la classe ci aggiungi 'extends ListActivity' e poi gli passi i dati alla listview usando l'adapter.
Facendo così dovresti vedere i pulsanti.Fammi sapere poi se ti funziona o meno. ;-)

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #3 il: 05 Settembre 2011, 16:18:51 CEST »
0
Grazie mille!

Riscontro sempre il solito problema, cioè il bottone viene aggiunto a ogni riga della lista e non una volta sola in basso!

Il metodo che ho utilizzato è molto simile al tuo tranne aver utilizzato un ArrayList da passare all'ArrayAdapter.
il file "R.layout.row" che passi all'inflater nel metodo getView è il file xml che mi hai scritto?

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Listview in pagine non funzionante
« Risposta #4 il: 05 Settembre 2011, 18:31:13 CEST »
0
Si.Nell'inflater gli passo il file di layout "row.xml" che è quello che ho postato.
Perchè utilizzi l'ArrayList?
Dovresti usare una ListView normale. E utilizzare un ArrayAdapter per passare i dati alla lista.
Almeno io ho fatto così e la lista viene visualizza correttamente con i pulsanti in fondo.


Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #5 il: 05 Settembre 2011, 18:46:15 CEST »
0
facevo io casino con i layout, ho risolto.

Ti faccio sapere se riesco a scorrere i risultati premendo sui tasti avanti e indietro

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Listview in pagine non funzionante
« Risposta #6 il: 05 Settembre 2011, 18:49:51 CEST »
0
Ma tu stai facendo il progetto unimi?

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #7 il: 05 Settembre 2011, 19:48:54 CEST »
0
si anche io  :-P

Comunque non capisco come mai il tuo codice non funziona...
"arrayinizio" che variabile è? dove la dichiari?
Forse on fa l'assegnamento arrayinizio = indfine nel metodo "AggiornaLista".

Prova con una serie di Log per verificare l'andamento delle tue variabili se non lo hai già fatto.
Non sarebbe più semplice definire una variabile statica a 0 che viene incrementata di 5 ogni tasto avanti e decrementata di 5 ogni tasto indietro, quindi riempire il "subNome" con il ciclo for, insomma riducendo il numero di variabili utilizzate almeno per renderti conto dove sta l'errore.
Se mi viene altro in mente ti dico.

PS: provi l'esame la prox settimana?

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Listview in pagine non funzionante
« Risposta #8 il: 06 Settembre 2011, 11:45:16 CEST »
0
Arrayinizio è una variabile che tiene l'indice del primo elemento da visualizzare nella pagina
è dichiarata all'interno della classe principale dell'activity quindi è visibile in tutto il codice.
Quando viene premuto il tasto avanti questo indice si incrementa di 5.
Comunque l'algoritmo di scorrimento della lista è corretto perchè prima mi funzionava e non l'ho modificato.
Adesso invece dato che ho dovuto inserire anche le icone in ogni riga, ho dovuto creare un customadapter per andare a fare il controllo sulla categoria del punto e inserire l'icona corrispondente.
Usando i Log sono riuscito ad individuare il problema.Ma non so come risolverlo.
Il problema sta nel metodo getView() :
Codice (Java): [Seleziona]
public class MyCustomAdapter extends ArrayAdapter<String> {

                public MyCustomAdapter(Context context, int textViewResourceId,
                String[] objects) {
                super(context, textViewResourceId, objects);
                // TODO Auto-generated constructor stub
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                //return super.getView(position, convertView, parent);
               
                LayoutInflater inflater=getLayoutInflater();
                View row=inflater.inflate(R.layout.row, parent, false);
                TextView label=(TextView)row.findViewById(R.id.punto);
                label.setText(poilist[position]);
                ImageView icon=(ImageView)row.findViewById(R.id.icon);
                Log.i("position",""+position);
                if (poi[position][1].equals("Bar")){
                icon.setImageResource(R.drawable.bar);
                }
                else if(poi[position][1].equals("Museo")){
                        icon.setImageResource(R.drawable.museo);
                        }
                else if(poi[position][1].equals("Cinema")){
                        icon.setImageResource(R.drawable.cinema);
                        }
                else if(poi[position][1].equals("Ristorante")){
                        icon.setImageResource(R.drawable.ristorante);
                        }
                else if(poi[position][1].equals("Shopping")){
                        icon.setImageResource(R.drawable.shopping);
                        }
               
                return row;

               
                }
}

Praticamente la variabile position non cambia. Se nella seconda pagina deve visualizzare 2 elementi, alla getView gli vengono passati come valori di position rispettivamente 0 e 1.invece dovrebbe passargli 5 e 6.Come posso fare a richiamare il metodo getView da codice passandogli i valori di position che voglio?

P.S. Si l'esame provo a darlo per il 12  :-P

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #9 il: 06 Settembre 2011, 15:21:56 CEST »
+2
Edit:

La variabile position in getView, non vorrei sbagliarmi, ma funziona in modo da scorrere tutti gli elementi della lista che passi all'adapter.
Piuttosto, nel costruttore dell'adapter io ho messo: this.items = items;
sotto la riga "super" dove items ovviamente è l'equivalente del tuo array Objects.
Nella getView() anzicchè un "poilist[position]" dovresti fare.

Codice (Java): [Seleziona]
label.setText(objects[position])
« Ultima modifica: 06 Settembre 2011, 15:27:33 CEST da Vincent »

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #10 il: 06 Settembre 2011, 15:29:10 CEST »
0
perchè altrimenti credo vada a prendere il tuo array/list di oggetti iniziale richiamando "poilist" nella getView(), invece dovresti scorrere gli oggetti che passi all'adapter che è il sottoinsieme di 5 elementi

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Listview in pagine non funzionante
« Risposta #11 il: 06 Settembre 2011, 16:13:08 CEST »
0
Siiiiii! Funziona!!! In effetti avevi proprio ragione. Non gli passavo l'array di sottoelementi ma quello contentente tutti i punti.
Funziona alla grande!!Sei un genio!!!
Ti ringrazio infinitamente! Probabilmente da solo non ce ne sarei venuto fuori. :-)

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Listview in pagine non funzionante
« Risposta #12 il: 06 Settembre 2011, 17:37:03 CEST »
0
figurati, ci si aiuta  ;)


in bocca al lupo (e ci si vede lunedì forse)