6 comentarios el “FragmentStatePagerAdapter con ListFragment en Android

  1. Hola buenas… entiendo que en este ejemplo podemos colocar cualquier .xml (FragmentA), pero cuando queremos darle funciones a ese .xml, es decir, en el xml añado un Button y quiero que al pulsar me abra una Activity, que me falta…

    No se si me he explicado, soy novato, bueno más para atrás de novato.

  2. Buenos Luis,

    Es fácil, no tiene complicación ninguna, ya que los Fragment no dejan de ser otra cosa que mini-Activities, por tanto tienen una forma de trabajar parecida respecto a Button, EditText o cualquier otro tipo de elemento. Te pongo un ejemplo sobre un FragmentC en el que puedes encontrar un Button que lanza un mensaje por medio de Toast:

    Su archivo layout, llamado fragmentc.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/btnBoton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Boton" />
    
    </LinearLayout>
    

    Su clase FragmentC:

    public class FragmentC extends Fragment {
    	private Button btnBoton;
    
    	@Override
    	public View onCreateView(LayoutInflater inflater, ViewGroup container,
    			Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		View v = inflater.inflate(R.layout.fragmentc, container, false);
    		btnBoton = (Button) v.findViewById(R.id.btnBoton);
    		return v;
    	}
    
    	@Override
    	public void onActivityCreated(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onActivityCreated(savedInstanceState);
    		btnBoton.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View arg0) {
    				// TODO Auto-generated method stub
    				Toast.makeText(getActivity(), "Ha pulsado un botón",
    						Toast.LENGTH_SHORT).show();
    			}
    		});
    	}
    
    }
    

    Como puedes ver si ejecutas esto con el código del ejemplo, aunque agregandolo a la lista mediante:

    listaFragments.add(new FragmentC());
    

    La aplicación se ejecuta, y el botón funciona como si de una Activity normal se tratase.

    Espero que te sea de ayuda,

    Saludos!!

    • Me parece que mis diseños van a dar un giro radical gracias a esto… ya sólo me falta entender como dar cualquier actividad, sea un simple button (en mi caso utilizo todo el Linealayout), un mapview, Mediaplayer, etc… y bueno ponerle TitlePager al ViewPager, vamos ponerle corbata al traje… pero ya estoy mucho más cerca de la ideaprincipal.

      Muchas gracias

  3. Buenas,

    Tengo una duda, estoy trabajando con ViewPager y ViewPagerIndicator. Tengo dos fragments que extienden los dos de ListFragment. La carga de datos la tengo puesta en el Oncreate de cada Fragment.
    Antes tenia mi MyFragmentAdapter extendido de FragmentPagerAdapter pero he visto tu articulo y ahora lo tengo como en el ejemplo con FragmentStatePagerAdapter. Parece que funciona mejor, pero sigo teniendo el mismo problema que antes, que es, que a la hora de ejecutar la aplicación me carga los datos de los dos fragment y son datos que tiran de conexión a Internet por lo que ralentiza mucho la aplicación. Pensaba que al utilizar en mi MyFragmentAdapter la extensión de FragmentStatePagerAdapter se iba a resolver esto. Es decir, que la aplicacion cargue solo los datos del primer Fragment y cuando se clique en el segundo que los cargue.

    ¿Alguna sugerencia?

    Felicidades por el articulo. Gracias.

    • Buenas Manuel, perdona que no te haya podido contestar antes.

      Por lo que me comentas no parece un caso de que te vaya lento por el adapter, sino porque al recuperar los datos via internet, dependerás de la conexión a nternet que tengas o del servidor para que esto vaya mas rápido o mas lento.

      Si lo que tienes son 2 Fragments en un FragmentStatePagerAdapter, o bien puedes cargar los datos únicamente del que se está visualizando, por lo que algunos de los métodos que tienen los Fragment te puede servir, o bien controlando el fragment que está siendo visto mediante el uso de la interface “OnPageChangeListener”, la cual indica a la Activity que página del FragmentPagerStaterAdapter está siendo cambiado.

      Otra alternativa es, tener estos elementos descargados antes de pasar a esa activity (en caso de que sea secundaria por ejemplo), o al bajarlos por primera vez cachear estos datos para tenerlos luego con mas rápido acceso.

      Espero haber sido de alguna ayuda.

      Saludos!

      • Gracias David por responderme.
        Al final me funciono mejor poner un AsyncTask en cada Fragment. Ahora estoy cacheando los datos, ya que aunque los dos Fragment me cargan deprisa, al hacer scroll se relantiza mucho.

        Lo dicho, gracias por la respuesta.
        Saludos.!!

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s