Como en, pueden los ELEMENTOS de un ListView ser Fragmentos. Sé que puede asignar un TextView XML a un ListView para cambiar su aspecto, pero puede agregar Fragmentos a un ListView.¿Puede un ListView contener fragmentos
Por ejemplo: Tengo un fragmento. El XML para dicho Fragment contiene un ImageView, un par de TextViews de gran estilo y un TextView pequeño. El código de clase Fragment recibe un Bundle, luego, según el contenido, rellena TextViews e ImageView en consecuencia. Tanto el Fragment XML como el código de Fragment funcionan sin problema (puedo mostrar un Fragmento individual muy bien). Tengo una FragmentActivity en la que quiero mostrar la lista de Fragmentos mencionada anteriormente. Aquí está el código que estoy usando para tratar de poblar el ListView dentro de vista del FragmentActivity:
ArrayList<Fragment> fragList = new ArrayList<Fragment>();
Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
Bundle bundle = new Bundle();
bundle.putInt("key", 0);
fragment.setArguments(bundle);
fragList.add(fragment);
ArrayAdapter<Fragment> adapter = new ArrayAdapter<Fragment>(this, R.layout.tile_item, fragList);
listItems.setAdapter(adapter);
Aquí está mi modo de pensar en esto. Hago un ArrayList de fragmentos para contener todas mis vistas creadas. Luego creo un Fragmento, creo un Paquete, agrego datos al Paquete (para que el Fragmento pueda reunir datos en sus Vistas correctamente), agrego el Paquete al Fragmento, luego finalmente agrego el Fragmento a la Lista de Arreglos. Después de eso, hago un ArrayAdapter, agrego el diseño del elemento que quiero usar y la lista de Fragmentos que he hecho; luego configure el ListView para leer desde mi adaptador.
Cualquiera que ejecute este código probablemente obtendrá el NPE @ creando una instancia del ArrayAdapter. ¿Lo que da? ¿Esto es posible? Antes de seguir analizando mi cerebro, ¿alguien puede decirme si solo estoy perdiendo el tiempo? ¿Hay una mejor manera? He estado pensando en usar ScrollView, pero gran parte de la funcionalidad de un ListView necesitaría volver a implementarse y odio, odio, odio, reinventar la rueda cuando no es necesario.
Gracias a todos los que lean, y especialmente gracias por su opinión si decide dejarlos. Intenté buscar una respuesta establecida, pero todo lo que parece son preguntas/páginas web sobre el uso de un ListView INSIDE de un fragmento; no usar Fragmentos COMO LOS ELEMENTOS de un ListView
Editar: Tomé las sugerencias a continuación y comencé a investigar más. Por la forma en que aparecen las cosas, debería ser capaz de usar un adaptador personalizado que infla fragmentos en lugar de simplemente construir desde XML (a falta de una mejor manera de describir el proceso). Sin embargo, mi implementación actual arroja un NPE cuando intento establecer el adaptador
Aquí está mi código adaptador personalizado (acortado por razones de brevedad):
public class AdapterItem extends ArrayAdapter<Fragment> {
Context c;
List<Fragment> f;
public AdapterItem(Context c, List<Fragment> f) {
super(c, R.layout.tile_item, f);
this.c = c;
this.f = f;
}
@Override
public View getView(int pos, View v, ViewGroup vg) {
LayoutInflater i = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return i.inflate(R.layout.tile_item, vg, false);
}
}
y aquí es cómo estoy implementarlo:
ArrayList<Fragment> fragList = new ArrayList<Fragment>();
Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
Bundle bundle = new Bundle();
bundle.putInt("key", 0);
fragment.setArguments(bundle);
fragList.add(fragment);
AdapterItem adapter = new AdapterItem(this, fragList);
adapter.add(fragment);
listItems.setAdapter(adapter);
así que ha sido unos pocos días y estoy bastante seguro de que este hilo ha sido enterrado. Sin embargo, pensé en agregar una última actualización por si alguien quiere probar esto y una búsqueda en Google los trae aquí. Entonces, en mi implementación obtengo un NPE cuando el ListView recibe el adaptador. No hace falta ser un cirujano espacial para descubrir que ciertamente es el adaptador y no el ListView que arroja el error. Por mi vida, no puedo entender por qué ...
En cualquier caso, creo que tengo una idea. Primero, un poco de historia: hace un tiempo que estaba tratando de hacer FragmentTransactions dentro de un FragmentDialog. Cada vez que intentaba hacerlo, obtenía un NPE. Eventualmente, a través de mucha investigación, descubrí que la razón se relacionaba con la forma en que los Fragmentos son instanciados. Cuando se llama a un Fragmento, necesita el contexto de su padre. Como el elemento primario de Dialog es la actividad que lo inició, el cuadro de diálogo en sí no cumplía los criterios necesarios.Creo que al intentar agregar fragmentos a un ListView, este también es el caso. Como el ListView no cumple con el acuerdo de instaurar un Fragment, lanza el NPE y, por lo tanto, me deja colgando y volviendo a las convenciones. D @ mn ... Realmente había esperado poder hacer esto. Usar Fragmentos en lugar de XML simple habría facilitado mucho la organización/búsqueda a través de la lista. Oh, bueno ... supongo que no se puede hacer en caso de que alguien se esté preguntando.
¿Por qué te * quiere * fragmentos para ser "ELEMENTOS de un ListView"? Los desarrolladores han estado creando 'ListView's durante años sin que sus elementos sean fragmentos. ¿Qué esperas obtener al convertirlos en fragmentos? – CommonsWare
Bueno, espero poder mostrar algo más que un simple TextView dentro de una lista (de hecho, podré mostrar una imagen y algunas líneas de texto adicionales). Además, podré reutilizar el código de fragmento una y otra vez de diferentes actividades sin duplicar el código. También he visto listas de desplazamiento de elementos que son más dinámicos que un simple TextView (como las listas en Google Play, son más complejas que solo un TextView). ¿Cómo se logra eso? ¿No sería posible ese mismo efecto (más fácil) usando un Fragmento? – user1449018
Puede hacerlo utilizando Adaptador y Vistas inflados desde XML para sus filas. –