2012-10-09 30 views
6

Tengo una pregunta sobre si usar View o Fragment con ViewPager.Usar vista o fragmento en ViewPager

Antecedentes: Tengo una actividad A que contiene un ListView. Cada elemento ListView abre la Actividad B. La Actividad B muestra contenido diferente según el elemento ListView que se toque en la Actividad A. El contenido de la Actividad B se muestra dentro de un ListView.

Pregunta: Ahora, en lugar de ir y venir entre la actividad A y B para cambiar los contenidos, tengo la obligación de poner en práctica la visión horizontal deslizar para cambiar el contenido todo dentro de la actividad B. Una solución que encontré (probado y funciona) es crear muchas instancias del ListView de la Actividad B y usarlo con ViewPager + PagerAdapter. Otra solución potencial que se encuentra en el documento (no lo he probado) es llevar ese ListView a un Fragmento, crear muchas instancias del fragmento y usarlo con ViewPager + FragmentPagerAdapter o FragmentStatePagerAdapter.

Mi pregunta es, ¿cuál es la ventaja de usar cada enfoque? ¿Debería hacer todo el trabajo de traer ListView a Fragment o simplemente usar ListView con ViewPager?

Gracias

Respuesta

10

Un Fragment es un enfoque útil, creo que, cuando se quiere amarrar algo de lógica de negocios de interfaz de usuario a un determinado View (o grupo de). Como usted sabe, ese individuo Fragment tiene sus propias devoluciones de llamada de ciclo de vida y demás, al igual que un Activity.

En lugar de tener una sola Activity anfitrión muchas ListView s a través de una sola PagerAdapter, se puede ser más limpio a utilizar el enfoque Fragment porque el Fragment sólo tiene que hacer frente a la lógica detrás de la conducción de un solo ListView.

Esta es una situación muy similar a la que acabo de enfrentar. Estoy mostrando varias formas de desplazamiento vertical (que constan de muchos campos de entrada) dentro de un ViewPager. En mi caso, opté por el enfoque Fragment porque, en mi caso, es posible que el ViewPager realmente necesite mostrar un tipo de vista completamente diferente en ciertas páginas. Por ejemplo, en las primeras páginas, se pueden mostrar los formularios de entrada del usuario. Pero en la página final, se mostrará un gráfico. Se requiere un conjunto completo de lógica para conducir ese gráfico. Manejar esos formularios de entrada y un gráfico desde un solo Activity sería un poco complicado, y probablemente necesitaría contener la lógica de negocios en varias clases de delegados o algo así. Así que para mí, Fragment s fueron la elección obvia al final. Tengo mi InputFormFragment y GraphFragment, y cada uno contiene solo la lógica aplicable para el View s que suministran.

Otra cosa a tener en cuenta es que en un futuro próximo también es posible que desee mostrar un tipo diferente de View en su ViewPager. O bien, es posible que desee tener otro diseño de interfaz de usuario, tal vez uno que no use el ViewPager pero que los muestre todos de lado a lado (por ejemplo, un diseño utilizado en una tableta grande en modo horizontal). Con Fragment s, las cosas son mucho más modulares y podría factorizar el código para hacerlo más rápido. Si, por otro lado, logró su objetivo utilizando un solo Activity que contiene un simple PagerAdapter y toda la lógica para el ListView s dentro, es posible que en el futuro necesite más trabajo para admitir nuevos tipos de View o diseños de tableta especiales. .

Una cosa voy a decir que se hayan aplicado Fragment s en un ViewPager mí mismo a través FragmentPagerAdapter y FragmentStatePagerAdapter, las cosas pueden ser un poco incómodo si usted tiene cualquier requisito especial; administrar Fragment s puede ser complicado a veces. Por ejemplo, para mi UI necesitaba poder agregar y eliminar mediante programación el ViewPager que contiene el Fragment s. También necesitaba asegurarme de que el adaptador en uso no destruyera Fragment s una vez que se hubieran mostrado, porque necesitaba recopilar datos de todos los Fragment simultáneamente en un cierto punto. Además, tuve que extender y modificar FragmentPagerAdatper para asegurarme de que Fragment s pasan por su onDestroy() correctamente y se eliminan del FragmentManager cuando se eliminó ViewPager.

Fragment s permiten una forma muy modular de construir interfaces de usuario para varios tamaños de pantalla y orientaciones, y son excelentes en cuanto a cómo encapsulan lógica de negocios y ciclos de vida para elementos de IU individuales. Sin embargo, si su escenario es tan simple como varios ListView s en un ViewPager y usted sabe que nunca necesitará la modularidad, entonces la sobrecarga de Fragment s podría ser una exageración.

+0

Acerca de la recopilación de información de fragmentos, ¿no sería más fácil crear una interfaz, hacer que el fragmento host haga referencia a un objeto que lo implemente y usar las funciones de interfaz para almacenar la información en ese objeto? –

+0

Si entiendo bien, creo que lo que estás sugiriendo es que en lugar de tener que hacer cosas inteligentes para asegurar que todos los Fragmentos permanezcan en el ViewPager (y no se eliminen constantemente y luego se vuelvan a crear), debería tener un mecanismo para persistir en su estado. Podría haber hecho esto y estaría de acuerdo en que sería un mejor enfoque, pero los Fragmentos en mi aplicación particular son bastante caros de construir. Por razones tanto de codificación como de rendimiento, era más sencillo simplemente asegurar que todos los Fragmentos se mantuvieran, y luego solicitar que todos envíen sus datos juntos. – Trevor

Cuestiones relacionadas