Autore Topic: Problema capire ViewPager  (Letto 596 volte)

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Problema capire ViewPager
« il: 06 Maggio 2013, 18:23:30 CEST »
0
Ciao a tutti, vorrei ottenere lo stesso effetto di swipe che c'è nella home page dei telefoni android. Ovvero, lo scorrimento orizzontale di pagine facendo lo swipe orizzontale. So che si può fare con il widget ViewPager ma non ho molto le idee chiare. Ho dato uno sguardo sul android developer ma non mi ha chiarito le idee. Qualcuno può spiegarmi come bisogna implementarlo suggerendomi magari links con esempi chiari?Grazie mille

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Problema capire ViewPager
« Risposta #1 il: 06 Maggio 2013, 23:16:11 CEST »
0
ViewPager è al contempo una delle view più utili e più complicate da capire al tempo stesso. Cercherò di essere il più possibile chiaro :)

Allora... Il viewpager è una view che permette, in modo facile e indolore di creare più pagine a cui accedere attraverso slides a destra e a sinistra.

E' disponibile nelle versioni più recenti di android, quindi per usarlo sulle versioni tipo la 2.3 devi aggiungere al tuo progetto la libreria support di android, e con quella puoi usare il viewpager fino alla versione 1.6 di android (praticamente il 99.8% dei dispositivi).

Passando al lato più tecnico:

Per facilitarti prova a pensare al viewpager come ad una listview. Ogni riga della listview è in realtà una pagina, e quindi anche il viewpager come la listview necessita di un adapter.

1- devi decidere se usare i fragment (soluzione più stilistica ed efficace) o semplici pagine (metodo più facile se le pagine devono contenere tutte lo stesso tipo di dati).
Esempio: se ogni pagina deve avere una immagine e un testo, io ti consiglio le "semplici pagine". se invece ogni pagina è diversa ti conviene creare i fragment relativi, anche per un discorso di leggibiltà del codice.

2- la struttura (schematica) è questa: viewpager -> pageradapter -> singola pagina, sia che scegli i fragment che le semplici pagine.

3- Io qui ti spiego le semplici pagine, che è più facile da fare (a mio parere):

allora... nell'activity hai il viewpager. Lo assegni ad una variabile come una qualsiasi view tramite il findviewbyid. Fatto questo crei una nuova classe CustomPagerAdapter che estende dal PagerAdapter. (fai attenzione ad importare i riferimenti dalla libreria support e non dai sorgenti standard di android).

4- nel CustomPagerAdapter (cerca su internet per dubbi eventuali) i metodi principali (oltre al costruttore) sono getView e getCount.
Dal nome si capisce bene che il primo restituisce la pagina alla posizione x (che viene passato come parametro). Il secondo restituisce il numero totale di pagine.
Adesso non posso usufruire di eclipse per postarti codice già pronto, ma prova tu e in caso nei prossimi giorni rimedio. :)

Comunque il metodo problematico è getView. Qui crei la tua pagina, e quindi tramite addView chiamato sul layout parent (che ti viene passato sempre come parametro) la aggiungi al viewpager. Per creare la pagina puoi sia "iniettare" file xml sia crearti la tua pagina via codice.

5- infine assegni l'adapter al viewpager come ad una comune listview (per farti l'esempio più comune).


Spero di essere stato abbastanza chiaro. Se no chiedi pure chiarimenti :)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Problema capire ViewPager
« Risposta #2 il: 07 Maggio 2013, 18:54:09 CEST »
0
Il concetto è abbastanza chiaro ma ho delle difficoltà a  scrivere il codice..se avete qualche esempio sarebbe perfetto. Grazie comunque per la tua risposta

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema capire ViewPager
« Risposta #3 il: 07 Maggio 2013, 19:04:08 CEST »
0
Il concetto è abbastanza chiaro ma ho delle difficoltà a  scrivere il codice..se avete qualche esempio sarebbe perfetto. Grazie comunque per la tua risposta

Nella sezione tutorial c'è un esempio che ho fatto tempo fa quando provai il viewpager.

[medio] Activity con ViewPager e Fragments - Android Developers Italia

E' un esempio un po' grezzo, probabilmente superato, ma se non altro fa prendere confidenza con i fragment.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Problema capire ViewPager
« Risposta #4 il: 07 Maggio 2013, 21:05:22 CEST »
0
Innanzitutto grazie mille per le risposte. Questa sera o domani provo ad utilizzare la guida e ti faccio sapere se sono riuscito.

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Problema capire ViewPager
« Risposta #5 il: 10 Maggio 2013, 19:19:32 CEST »
0
Bradipo ho letto la guida sui fragment ma non ho molto capito come si usano. Per quanto riguarda il view pager diciamo che ho quasi risolto creando due file xml che sarebbero i miei layout. In uno c'è una imageview e due textview e nell'altro 2 textview. Il problema è che devo popolare questi widgets a runtime con un JSONObject. Dove devo andare ad assegnare i dati? Nel metodo instantiateItem del pageAdapter oppure in un metodo privato? Inoltre se volessi aggiungere un'animazione alpha quando vado avanti e indietro tra le due pagine come dovrei fare? Grazie mille

Il codice del pageAdapter che ho preso dal web e funzionante è questo:

Codice (Java): [Seleziona]
  private class AwesomePagerAdapter extends PagerAdapter{

         
          @Override
          public int getCount() {
                  return 2;
          }

      /**
       * Create the page for the given position.  The adapter is responsible
       * for adding the view to the container given here, although it only
       * must ensure this is done by the time it returns from
       * {@link #finishUpdate(android.view.ViewGroup)}.
       *
       * @param collection The containing View in which the page will be shown.
       * @param position The page position to be instantiated.
       * @return Returns an Object representing the new page.  This does not
       * need to be a View, but can be some other container of the page.
       */

          @Override
          public Object instantiateItem(ViewGroup collection, int position) {
               
                          LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                          int resId = 0;
                          switch (position) {
                                                                        case 0:
                                                                                        resId = R.layout.profilefirstpageview;
                                                                                        break;
                                                                        case 1:
                                                                                        resId = R.layout.profilesecondpageview  ;
                                                                                        break;

                                                                }

                                View view = inflater.inflate(resId, null);

                                ((ViewPager) collection).addView(view, 0);

                                return view;
                 
                 
          }

      /**
       * Remove a page for the given position.  The adapter is responsible
       * for removing the view from its container, although it only must ensure
       * this is done by the time it returns from {@link #finishUpdate(android.view.ViewGroup)}.
       *
       * @param collection The containing View from which the page will be removed.
       * @param position The page position to be removed.
       * @param view The same object that was returned by
       * {@link #instantiateItem(android.view.View, int)}.
       */

          @Override
          public void destroyItem(ViewGroup collection, int position, Object view) {
               ((ViewPager)collection).removeView((View) view);
          }


  /**
   * Determines whether a page View is associated with a specific key object
   * as returned by instantiateItem(ViewGroup, int). This method is required
   * for a PagerAdapter to function properly.
   * @param view Page View to check for association with object
   * @param object Object to check for association with view
   * @return
   */

          @Override
          public boolean isViewFromObject(View view, Object object) {
                  return (view==object);
          }

         
      /**
       * Called when the a change in the shown pages has been completed.  At this
       * point you must ensure that all of the pages have actually been added or
       * removed from the container as appropriate.
       * @param arg0 The containing View which is displaying this adapter's
       * page views.
       */

          @Override
          public void finishUpdate(ViewGroup arg0) {}
         

          @Override
          public void restoreState(Parcelable arg0, ClassLoader arg1) {}

          @Override
          public Parcelable saveState() {
                  return null;
          }

          @Override
          public void startUpdate(ViewGroup arg0) {}
 
}