Autore Topic: Visualizzare galleria di immagini caricate dinamicamente  (Letto 661 volte)

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Visualizzare galleria di immagini caricate dinamicamente
« il: 13 Agosto 2014, 11:15:58 CEST »
0
Salve, sto cercando di fare un app che consenta di visualizzare delle immagini, solo che queste immagini non devono essere tutte presenti in memoria ma devo poterne caricare e mostrare solo qualcuna per volta (perché devo scaricarle da internet, quindi sarebbe privo di senso scaricarle tutte a priori). Per farlo ho pensato di usare un array di 5 elementi di cui le immagini realmente visualizzate sono quelle presenti nei tre elementi centrali, mentre il primo e l'ultimo elemento sono immagini duplicate per far sì che la transizione sia più gradevole esteticamente (dovendo caricare dinamicamente le immagini l'unica soluzione che mi è venuta in mente è stata quella di usare un array circolare).
Per realizzare ciò ho preso e modificato un esempio di Google sull'uso dei ViewPager, solo che mi funziona (male) in modo strano. Ecco i codice:
La classe principale (non fa niente di rilevante):
Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                // Handle action bar item clicks here. The action bar will
                // automatically handle clicks on the Home/Up button, so long
                // as you specify a parent activity in AndroidManifest.xml.
                int id = item.getItemId();
                if (id == R.id.action_settings) {
                        return true;
                }
                return super.onOptionsItemSelected(item);
        }
       
        public void avvia(View v){
                startActivity(new Intent(this, ScreenSlideActivity.class));
        }
}

L'activity che contiene il ViewPager (per il momento sto cercando di implementare correttamente il caricamento dinamico solo con lo scorrimento a destra):
Codice (Java): [Seleziona]
public class ScreenSlideActivity extends FragmentActivity {
        /**
         * The number of pages (wizard steps) to show in this demo.
         */

        private static int NUM_PAGES = 5;
        int oldPage = 1;

        /**
         * The pager widget, which handles animation and allows swiping horizontally to access previous
         * and next wizard steps.
         */

        private ViewPager mPager;

        /**
         * The pager adapter, which provides the pages to the view pager widget.
         */

        private PagerAdapter mPagerAdapter;
       

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_screen_slide);
               
                // Instantiate a ViewPager and a PagerAdapter.
                mPager = (ViewPager) findViewById(R.id.pager);
                FragmentManager fm = getFragmentManager();
               
                mPagerAdapter = new ScreenSlidePagerAdapter(fm);
                mPager.setAdapter(mPagerAdapter);
                mPager.setCurrentItem(1);
                mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                        @Override
                        public void onPageSelected(int position) {
                                int pageCount = NUM_PAGES;
                                /*position è la posizione della prossima pagina*/
                                //Log.v("asd", "Prossima pagina " + position + " da " + oldPage);
                               
                                if( position == 0){
                                        mPager.setCurrentItem(3,false);
                                        if (toRight(position, oldPage)) ScreenSlidePageFragment.rightShift(oldPage);
                                        oldPage = 1;
                                }
                                else if( position == 4){
                                        mPager.setCurrentItem(1,false);
                                        if (toRight(position, oldPage)) ScreenSlidePageFragment.rightShift(oldPage);
                                        oldPage = 3;
                                }
                                else{
                                        mPager.setCurrentItem(position,false);
                                        if (toRight(position, oldPage)) ScreenSlidePageFragment.rightShift(oldPage);
                                        oldPage = position;
                                }                              
                               
                        }

                        @Override
                        public void onPageScrolled(int arg0, float arg1, int arg2) {
                                // TODO Auto-generated method stub

                        }

                        @Override
                        public void onPageScrollStateChanged(int state) {
                               
                        }
                });

        }
       
        public boolean toRight(int newPos, int oldPos){
                if (newPos == 2 && oldPos == 1) return true;
                if (newPos == 3 && oldPos == 2) return true;
                if (newPos == 1 && oldPos == 3) return true;
                if (newPos == 4 && oldPos == 3) return true;
                return false;
        }
       
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                super.onCreateOptionsMenu(menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

                return super.onOptionsItemSelected(item);
        }

        /**
         * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in
         * sequence.
         */

        private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
                public ScreenSlidePagerAdapter(FragmentManager fm) {
                        super(fm);
                }

                @Override
                public android.app.Fragment getItem(int position) {
                        return ScreenSlidePageFragment.create(position);
                }

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

Questo invece è il fragment:
Codice (Java): [Seleziona]
public class ScreenSlidePageFragment extends Fragment {
        /**
         * The argument key for the page number this fragment represents.
         */

        public static final String ARG_PAGE = "page";

        /**
         * The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}.
         */

        private static int mPageNumber;
        int i = 0;
        static int indiceGlobale = 3;
        private static int[] resources = {R.drawable.exotic, R.drawable.apple, R.drawable.arab, R.drawable.exotic, R.drawable.apple};
        static int[] immagini = {R.drawable.apple, R.drawable.arab, R.drawable.exotic, R.drawable.fishing, R.drawable.island,
                R.drawable.maldives, R.drawable.nice, R.drawable.sahara, R.drawable.simple, R.drawable.wallpaper};
       
        /**
         * Factory method for this fragment class. Constructs a new fragment for the given page number.
         */

        public static ScreenSlidePageFragment create(int pageNumber) {
                ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_PAGE, pageNumber);
                fragment.setArguments(args);
                return fragment;
        }

        public ScreenSlidePageFragment() {}

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                mPageNumber = getArguments().getInt(ARG_PAGE);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                // Inflate the layout containing a title and body text.
                ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false);

                Log.v("asd", "Elemento " + mPageNumber);
               
                ((ImageView) rootView.findViewById(R.id.image)).setImageDrawable(getResources().getDrawable(resources[mPageNumber]));
                return rootView;
        }

        /**
         * Returns the page number represented by this fragment object.
         */

        public int getPageNumber() {
                return mPageNumber;
        }
       
        public static void rightShift(int actualPage){
                /*Quelli che contano le immagini vere e proprie sono i tre elementi centrali: quando scorro verso destra passo dall'elemento 3 all'elemento 4.
                 * L'elemento 1 conterrà la prossima immagine.*/

                if (indiceGlobale >= immagini.length) {
                        Log.v(tag, "siamo in fondo");
                        return;
                }
                //Log.v(tag, "ind = " + indiceGlobale + " con pagina " + actualPage);  
                if (indiceGlobale == 3){
                        if(actualPage == 2){
                                resources[1] = immagini[indiceGlobale];
                        }
                        else if ( actualPage == 3){
                                indiceGlobale = indiceGlobale + 1;
                                resources[2] = immagini[indiceGlobale];
                        }
                        else if (actualPage == 1){
                                resources[4] = immagini[indiceGlobale];
                        }
                }
                else{
                        if(actualPage == 2){
                                resources[0] = immagini[indiceGlobale - 1];
                                resources[1] = immagini[indiceGlobale];
                                resources[4] = immagini[indiceGlobale];
                        }
                        else if ( actualPage == 3){
                                resources[2] = immagini[indiceGlobale];
                        }
                        else if (actualPage == 1){
                                resources[3] = immagini[indiceGlobale];
                               
                        }
                        indiceGlobale = indiceGlobale + 1;
                }              
        }
}

Per il momento sto cercando di implementare il caricamento dinamico prendendo immagini da un array di risorse solo che non mi funziona nemmeno così.
Come già detto l'array resources viene usato in modo circolare. Parto dall'elemento 1, poi scorro fino al 3° e quando scorro ulteriormente invece che finire sull'elemento 4 torno nuovamente all'elmento 1 che nel frattempo è stato aggiornato con una nuova immagine.
Nel complesso riscontro un unico vero problema: il valore che fa da indice dell'array, mPageNumber, assume valori in modo che per me non hanno senso.
Io imposto all'inizio la pagina ad 1 ed mPageNumber mi assume, di seguito, i valori 1, 0 e poi 2 (non so perché). Anche dopo assume valori a caso, talvolta due per volte, senza che io capisca con quale logica gli vengano assegnati. Per fare un esempio, avviando l'app e scorrendo sempre a destra ho ottenuto questa serie di valori di mPageNumber:
Codice: [Seleziona]
08-13 10:52:55.369: V/asd(28549): Elemento 1
08-13 10:52:55.379: V/asd(28549): Elemento 0
08-13 10:52:55.379: V/asd(28549): Elemento 2
08-13 10:53:08.983: V/asd(28549): Elemento 3
08-13 10:53:10.725: V/asd(28549): Elemento 4
08-13 10:53:14.289: V/asd(28549): Elemento 1
08-13 10:53:14.289: V/asd(28549): Elemento 0
08-13 10:53:23.108: V/asd(28549): Elemento 3
08-13 10:53:25.180: V/asd(28549): Elemento 4
08-13 10:53:27.213: V/asd(28549): Elemento 1
08-13 10:53:27.223: V/asd(28549): Elemento 0
All'inizio pensavo che il valore di mPageNumber venisse assegnato via setCurrentItem nell'activity, ma chiaramente così non può essere perché altrimenti non dovrebbe poter assumere i valori 0 e 4.
Sapete dirmi come posso gestire correttamente gli inidici dell'array oppure se ci sia un altro modo per implementare una galleria senza che le immagini siano già tutte presenti in memoria all'inizio?
« Ultima modifica: 13 Agosto 2014, 11:40:17 CEST da Ilgard »

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Visualizzare galleria di immagini caricate dinamicamente
« Risposta #1 il: 18 Agosto 2014, 15:44:56 CEST »
0
Nessuno che sappia consigliarmi come fare una galleria di immagini, con le immagini caricate a tempo di esecuzione?

Offline maverik1408

  • Utente junior
  • **
  • Post: 100
  • Respect: +1
    • Mostra profilo
    • MaverikApps
  • Dispositivo Android:
    NEXUS 5
  • Play Store ID:
    Maverik
Re:Visualizzare galleria di immagini caricate dinamicamente
« Risposta #2 il: 27 Agosto 2014, 08:10:52 CEST »
0
qui la position è corretta?!

Codice: [Seleziona]
@Override
                public android.app.Fragment getItem(int position) {
                        return ScreenSlidePageFragment.create(position);
                }
Maverik @ Google Play Store

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Visualizzare galleria di immagini caricate dinamicamente
« Risposta #3 il: 29 Agosto 2014, 12:05:11 CEST »
0
No: lì la posizione è la stessa degli altri punti del programma.