Autore Topic: ViewPager e caricamento da DB  (Letto 429 volte)

Offline sesi

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: +1
    • Mostra profilo
ViewPager e caricamento da DB
« il: 16 Gennaio 2013, 16:15:17 CET »
0
Buongiorno a tutti!
In una nuova app mi sono imbattuto nel ViewPager (utilizzando il package android.support.v4).
In pratica, nel mio db ho 7 pagine e devo mostrarle in un ViewPager (perchè devo avere uno scroll in orizzontale con paginazione). Ogni pagina ha una struttura uguale: ImageView per la foto di sfondo, TextView per il titolo e WebView per il testo.
Ho pensato quindi di creare un Fragment comune e di caricare 7 fragment nel mio ViewPager, andando poi ad estrarre nel fragment i contenuti adatti.
Ho quindi creato i seguenti file

ScrollPagine, che ha il ViewPager
Codice (Java): [Seleziona]
public class ScrollPagine extends FragmentActivity{
        String TAG = "ScrollPagine";
        List<Fragment> fragments = new Vector<Fragment>();
        private ScrollPagineAdapter mPagerAdapter;
        private ViewPager mPager;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_scroll_pagine);
               
                //creo i fragment e li aggiungo alla lista
                for(int i=0; i<=6; i++){
                        fragments.add(Fragment.instantiate(this, ScrollPagineFragment.class.getName()));
                }
                for(int i=0; i<=6; i++){
                        ScrollPagineFragment fragment = (ScrollPagineFragment) fragments.get(i);
                        fragment.myIdPagina = i;
                }
               
                //creo l'adapter e lo linko al view pager
        this.mPagerAdapter = new ScrollPagineAdapter(super.getSupportFragmentManager(), fragments);
        mPager = (ViewPager) super.findViewById(R.id.scrollPagine);
        mPager.setAdapter(this.mPagerAdapter);
       
        //leggo l'indice della pagina a cui andare
        Intent intent = getIntent();
        String pkg = getPackageName();
        int indicePag = intent.getIntExtra(pkg+".myIndice", -1);
        Log.i(TAG, "-> vado a pagina "+indicePag);
        mPager.setCurrentItem(indicePag);
       
                //azioni su bottoni
        findViewById(R.id.btnSchermataMenu).setOnClickListener(gestore);
        }
}
e il suo file di interfaccia grafica
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  
   xmlns:android="http://schemas.android.com/apk/res/android"  
   android:layout_height="fill_parent"  
   android:layout_width="fill_parent">
        <android.support.v4.view.ViewPager
                android:id="@+id/scrollPagine"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_margin="0dp"
       android:layout_alignParentTop="true"
       android:layout_alignParentLeft="true" >
    </android.support.v4.view.ViewPager>
        <Button
       android:id="@+id/btnSchermataMenu"
       android:layout_width="150dp"
       android:layout_height="wrap_content"
       android:text="@string/btn_menu_principale"
       android:padding="0dp"
       android:layout_margin="0dp"
       android:layout_alignParentRight="true"
       android:layout_alignParentBottom="true" />
</RelativeLayout>

ScrollPagineFragment, cioè il fragment da ripetere 7 volte e che si occupa della lettura dal db dei dati
Codice (Java): [Seleziona]
public class ScrollPagineFragment extends Fragment{
        String TAG = "ScrollPagineFragment";
        public int myIdPagina = 0;
       
        public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
              if(container == null){
                 return null;
              }
              myIdPagina++;
              Log.i(TAG, "-> onCreateView() "+myIdPagina);
             
              //mi connetto al db e leggo la pagina
              DatabaseHandler db = new DatabaseHandler(getActivity());
              Pagina pagina = db.getPagina(myIdPagina);
             
              //definisco le variabili
              Typeface fontEtruschi = Typeface.createFromAsset(getActivity().getAssets(), "fonts/etruscansnp-Regular.ttf");
              final String mimeType = "text/html";
              final String encoding = "UTF-8";
              final String stile = "<html><head><style type='text/css'>"+
                                        "body{ font-size:13px;color:#FFFFFF;margin:0px;padding:0px;font-family:HelveticaNeueLTStd-Roman;padding-right:10px;line-height:16px;letter-spacing:0px; }"+
                                        "b{ font-size:14px; }"+
                                        "ul{ list-style-type:circle; }"+
                                        "li{ padding:0px;margin:0px; }"+
                                        "</style></head>";
             
              //prendo i riferimenti alle interfacce grafiche
              View myView = (RelativeLayout)inflater.inflate(R.layout.activity_scroll_pagine_dettaglio, container, false);
              ImageView imgSfondo = (ImageView) myView.findViewById(R.id.scrollPagineLayoutSfondo);
              TextView txtTitolo = (TextView) myView.findViewById(R.id.scrollPagineLayoutTitolo);
              WebView webTesto = (WebView) myView.findViewById(R.id.scrollPagineLayoutTesto);
             
              //setto lo sfondo
              int resSfondo = getResources().getIdentifier("bg_pagina_"+myIdPagina, "drawable", "it.sesinet.android.segnietruschi");
              imgSfondo.setImageResource(resSfondo);
             
              //setto il titolo
              txtTitolo.setTypeface(fontEtruschi);
              txtTitolo.setTextSize(18.f);
              txtTitolo.setText(pagina.getTitolo());
             
              //setto il testo html
              webTesto.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
              webTesto.setVerticalScrollBarEnabled(true);
              webTesto.setBackgroundColor(0x00000000);
              webTesto.loadDataWithBaseURL("", stile+"<body>"+pagina.getTesto()+"</body></html>", mimeType, encoding, "");
             
              return myView;
           }
}
e la sua interfaccia grafica
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"
        android:id="@+id/scrollPagineLayout">
    <ImageView
       android:id="@+id/scrollPagineLayoutSfondo"
       android:src="@drawable/bg_pagina_1"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:contentDescription="@string/sfondo"
       android:layout_alignParentTop="true"
       android:layout_alignParentLeft="true" />
    <TextView
            android:id="@+id/scrollPagineLayoutTitolo"
            android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/bianco"
                android:layout_marginTop="200dp"
       android:layout_marginLeft="20dp"
                android:text="TITOLO" />
    <WebView
            android:id="@+id/scrollPagineLayoutTesto"
            android:layout_width="match_parent"
                android:layout_height="250dp"
                android:textColor="@color/bianco"
                android:layout_marginTop="240dp"
       android:layout_marginLeft="20dp"
                android:text="TESTO" />
</RelativeLayout>

ScrollPagineAdapter, che è l'adapter per caricare i fragment
Codice (Java): [Seleziona]
public class ScrollPagineAdapter extends FragmentPagerAdapter{
        private List<Fragment> fragments;
        String TAG = "ScrollPagineAdapter";
       
        public ScrollPagineAdapter(FragmentManager fm,List<Fragment> fragments) {
                super(fm);
                this.fragments = fragments;
        }
       
        @Override
        public Fragment getItem(int position){
                Log.i(TAG, "-> getItem() "+position);
                return this.fragments.get(position);
        }
       
        @Override
        public int getCount(){
                Log.i(TAG, "-> getCount() "+this.fragments.size());
                return this.fragments.size();
        }
}

ora, il tutto funziona: il programma crea 7 schermate e visualizza correttamente il tutto. Il problema entra però quando vado avanti nelle pagine e poi torno indietro e avanti: inizia a creare doppioni di pagina (2 schermate uguali di seguito), sbaglia gli indici e via cosi.

Come posso fare a sistemare il tutto? In pratica devo caricare le 7 schermate e mantenere quelle!
Mi potete aiutare?

Grazie mille!