studio - tabs android
instantiateItem(ViewGroup, int) en PagerAdapter y AddView en la confusiĆ³n de ViewPager (2)
Hasta ahora he estado hackeando ejemplos para familiarizarse con las API del SDK de Android en general. Sin embargo, he llegado a un punto muerto.
Estoy intentando inflar un LinearLayout con 2 TextViews de un archivo XML. Estas serán las vistas que están paginadas. Simplemente no puedo hacer que esto funcione y me doy cuenta de que no entiendo totalmente lo que sucede con el código.
En cuanto a la fuente, puedo ver que el método ViewPager.addNewItem llama al InstantiateItem desde el adaptador suministrado. Y addNewItem se llama en populate()
. Se llama a populate () en varios otros lugares.
De todos modos, en el ejemplo, he experimentado que cuando se reemplaza el método para PagerAdapter, se debe incluir una llamada a addView()
en la colección ViewPager que se pasa desde ViewPager
como argumento.
Si deseo agregar varias vistas, pensé que este sería un caso de llamar a addView () más de una vez, pero como instantiateItem () devuelve un objeto a ViewPager (en el ejemplo que tenía, devuelve la vista que agregó). saber que devolver He intentado devolver la vista inflada y una serie de otras cosas.
Por favor, ¿alguien puede explicar lo que está pasando aquí?
Muy apreciado.
@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;
}
Recientemente he implementado esto y este es mi método instantiateItem
(lo hizo un poco mínimo para facilitar la lectura.
@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;
}
Entonces, para la página que se muestra, obtengo los datos de mi lista de evaluations
utilizando la posición como índice. Luego, infle el Layout
que tiene las vistas, también agregaré mis datos. Luego obtengo TextView
para establecer el texto de resumen de la evaluación. Entonces todo el Layout
se agrega al ViewPager
. Y finalmente se devuelve el Layout
.
Si todavía no puedes conseguirlo, publica tu código.
Tengo el mismo malentendido de cómo funciona este adaptador y he realizado algunas investigaciones.
La particularidad clave es que sus vistas se almacenan en dos lugares:
1 en ViewPager los agrega llamando al ((ViewPager) container).addView(view);
(Aquí solo debe almacenar tres vistas, lo que ve y los barrios izquierdo y derecho)
2 en private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>();
este es miembro de ViewPager; hay vistas almacenadas con información sobre su posición (se agregan aquí al llamar al método del adaptador mAdapter.instantiateItem(this, position);
)
static class ItemInfo {
Object object;
int position;
boolean scrolling;
float widthFactor;
float offset;
}
Cuando se desliza, ViewPager
obtiene la posición de mItems
matriz de mItems
o mItems
una instancia de ella y compara esta vista con los hijos de ViewPager
con el método de adaptadores public boolean isViewFromObject(View view, Object object)
. La vista que es igual al object
se muestra al usuario en ViewPager
. Si no hay una vista, se muestra la pantalla en blanco.
Aquí está el método ViewPager
donde la vista se compara con el objeto:
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;
}
Si la posición de las vistas desde mItems no está dentro del rango {currentposition -1, currentposition +1}, se destruirá:
mItems.remove(itemIndex);
mAdapter.destroyItem(this, pos, ii.object);
La vista de la memoria de ViewPagers 1
Es una trampa con destroyItem
cuando las diapositivas se llama en destroyItem
lugar destroyItem
y luego se agrega un nuevo elemento, pero cuando se desliza hacia atrás, primero se agrega un nuevo elemento y luego se destruye el antiguo. Si intenta utilizar solo tres vistas en caché, puede obtener IllegalStateException: The specified child already has a parent.
mientras se desliza hacia atrás.