InstantiateItem in PagerAdapter e AddView in confusione di ViewPager

Finora sono stato hacking insieme esempi per get un tatto per le API l'Anfroid SDK nel suo complesso. Tuttavia ho colpito un'impasse.

Sto cercando di gonfiare un LinearLayout con 2 TextViews da un file XML. Queste saranno le visualizzazioni che vengono pagate. Io semplicemente il canot get this per lavorare e rendersi conto che non capisco completamente che cosa sta succedendo con il codice.

  • Utilizzo di listItemFirstLineStyle nel mio layout
  • Come aggiungere un controllo di button a una vista xml android a runtime?
  • Android: il colore della barra del titolo non cambia
  • Errore durante l'aggiornamento della vista in cima a SurfaceView
  • come fare uno spettacolo di barra di avanzamento in cima a un button in android
  • Come fare RatingBar per mostrare cinque stelle
  • Guardando l'origine vedo che il metodo ViewPager.addNewItem chiama l'InstantiateItem dalla scheda fornita. E addNewItem viene chiamato in populate (). la popolazione viene chiamata in un certo numero di altri luoghi.

    Comunque nell'esempio che ho visto quando il metodo viene sovrascritto per PagerAdapter, è necessario includere una chiamata a AddView nella colletione ViewPager che viene passata dal viewpager come argomento.

    Se desidero aggiungere più viste ho pensato che questo sarebbe un caso di call addView più di una volta, ma come istantiateItem restituisce un object a ViewPager (nell'esempio che ho riportto la visualizzazione che ha aggiunto) non so cosa tornare . Ho provato a restituire la vista gonfiata e un certo numero di altre cose.

    Per favore, può qualcuno spiegare cosa sta succedendo qui?

    Molto apprezzato.

    M

    @Override public Object instantiateItem(View collection, int position) { layout = inflater.inflate(R.layout.animallayout, null); TextView tv = (TextView) layout.findViewById(R.id.textView1); tv.setText("1________________>" + position); TextView tv2 = (TextView) layout.findViewById(R.id.textView2); tv.setText("2________________>" + position); ((ViewPager) collection).addView(layout); return layout; } 

  • Pulsante onClick in viewPager?
  • ViewPager FragmentPagerAdapter Nullpointer
  • Il primo frammento di ViewPager mostrato è sempre errato con FragmentStatePager
  • Come posso fare il mio button per fare qualcosa in Fragments, ViewPager
  • Viewpager + FragmentStatePagerAdapter + Frammento non funzionante
  • Passaggio di un frammento nel constructor di un adattatore
  • 2 Solutions collect form web for “InstantiateItem in PagerAdapter e AddView in confusione di ViewPager”

    Ho recentemente implementato questo e questo è il mio metodo instantiateItem (ha reso un po 'minima per la leggibilità.

     @Override public Object instantiateItem(View collection, int position) { Evaluation evaluation = evaluations.get(position); View layout = inflater.inflate(R.layout.layout_evaluation, null); TextView evaluationSummary = (TextView) layout.findViewById(R.id.evaluation_summary); evaluationSummary.setText(evaluation.getEvaluationSummary()); ((ViewPager) collection).addView(layout); return layout; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } 

    Quindi, per la pagina visualizzata, ottengo i dati dalla mia list di evaluations usando la posizione come indice. Infine giri il Layout che ha le viste che aggiungerò i miei dati. Poi ottengo il TextView per impostare il text di riepilogo di valutazione. Quindi l'integer Layout viene aggiunto al ViewPager . E infine il Layout è anche restituito.

    Se ancora non riesci a farlo postare il tuo codice.

    Ho lo stesso incomprensione di come funziona questa scheda e ho fatto delle indagini.
    La particolarità chiave è che i tuoi punti di vista sono memorizzati in due punti:
    1 in ViewPager li aggiungete chiamando il ((ViewPager) container).addView(view); (qui è necessario memorizzare solo tre viste, ciò che si vede e quartieri sinistro e destro)
    2 in private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>(); questo è membro di ViewPager ci sono viste memorizzate con informazioni relative a loro possition (vengono aggiunte qui chiamando il metodo di adattamento mAdapter.instantiateItem(this, position); )

     static class ItemInfo { Object object; int position; boolean scrolling; float widthFactor; float offset; } 

    Quando si scorre, ViewPager ottiene la posizione di mItems dall'arrays mItems oppure lo istanzia e confronta questa vista con i figli di ViewPager con il metodo adattatori public boolean isViewFromObject(View view, Object object) . Visualizza che è uguale object viene visualizzato all'utente in ViewPager . Se non c'è visualizzazione, viene visualizzata la schermata vuota.
    Ecco il metodo ViewPager cui la vista viene confrontata con l'object:

     ItemInfo infoForChild(View child) { for (int i=0; i<mItems.size(); i++) { ItemInfo ii = mItems.get(i); if (mAdapter.isViewFromObject(child, ii.object)) { return ii; } } return null; } 

    Se la posizione di visualizzazione da mItems non è nell'intervallo {currentposition -1, currentposition +1} allora verrà distrutta:

     mItems.remove(itemIndex); mAdapter.destroyItem(this, pos, ii.object); 

    la vista della memory ViewPagers 1

    È una trappola con destroyItem quando si scivola in avanti i destroyItem viene chiamata destroyItem e poi viene aggiunto un nuovo elemento, ma quando si scivola all'indietro si aggiunge un nuovo elemento e poi viene annullato. Se si tenta di utilizzare solo tre viste memorizzate nella cache, è ansible get IllegalStateException: The specified child already has a parent. scivolando all'indietro.

    Memoria di ViewPager

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.