Cómo cargar datos de fragmentos sólo cuando se hace clic en su pestaña en PagerSlidingTabStrip
Estoy usando PagerSlidingTabStrip
en mi proyecto y estoy mostrando datos en fragmentos. Es una gran biblioteca que funciona muy bien. Cada fragmento consiste en conferencias de un erudito que se cargan de un servicio de la tela. El código para acceder al servicio web está en el método onCreateView
del fragmento. Actualmente, todos los datos del fragmento se cargan al mismo tiempo cuando se agregan a ViewPager
. Me preguntaba si hay alguna forma de cargar los datos del fragmento sólo cuando un usuario hace clic / desliza a una pestaña específica. No todo a la vez.
El código actual es bastante estándar, tomé la ayuda del ejemplo proporcionado [solución androide]. 1
- Crear pestañas en SlidingTabLayout no deslizar
- PagerSlidingTabStrip NullPointerException al establecer ViewPager
- PagerSlidingTabStrip: Alineación de las pestañas de ViewPager a la derecha
- Error de PagerSlidingTabStrip cuando está abierto
- Desplazar ficha - NullPointerException - Android
Pager Adapter es el siguiente:
public class ScholarDetailPagerAdapter extends FragmentPagerAdapter { private final String[] TITLES = { "Scholar Info", "Lectures"}; Scholar _scholar; public ScholarDetailPagerAdapter(FragmentManager fm, Scholar scholar) { super(fm); _scholar = scholar; } @Override public CharSequence getPageTitle(int position) { return TITLES[position]; } @Override public Fragment getItem(int arg0) { if(arg0 == 0) return ScholarsInfoFragment.netInstance(_scholar.Name, _scholar.Information, _scholar.ThumbnailUrl); else return ScholarLecturesFragment.newInstance(_scholar.ScholarId); } @Override public int getCount() { return TITLES.length; } }
Devuelve DOS fragmentos, Info y Lectures. El fragmento de las conferencias llama a un servicio web para obtener conferencias de un erudito.
El código de actividad es:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set the Above View setContentView(R.layout.tabbed_view); Scholar scholar = getScholar(getIntent()); _tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs); _pager = (ViewPager) findViewById(R.id.pager); _adapter = new ScholarDetailPagerAdapter(getSupportFragmentManager(), scholar); _pager.setAdapter(_adapter); final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources() .getDisplayMetrics()); _pager.setPageMargin(pageMargin); _tabs.setViewPager(_pager); }
He intentado agregar _tabs.setOnPageChangeListener(this);
Y terminé teniendo onPageSelected(int arg0)
en mi actividad también. Pensé que sería fácil ahora. Luego modifiqué public Fragment getItem(int arg0)
en ScholarDetailPagerAdapter
y ScholarDetailPagerAdapter
null
lugar de devolver dos fragmentos. Pero eso generó una excepción. Pensé que sería hacer visiones vacías en buscapersonas .. pero por supuesto que estaba equivocado.
Para asegurarse de que Fragmento carga datos cuando se hace clic en su respectiva pestaña y es visible, también he intentado invalidar sus siguientes eventos y escribí la llamada de carga de datos en ellos:
-
onResume()
No funciona. Todavía carga datos cuando se agrega en la actividad -
Trató de reemplazar onHiddenChanged
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if(!hidden){ loadLectures(); }
}
Esto no funcionó también. No hay datos cargados como si este evento no se disparara en absoluto.
¿Cómo puedo hacer eso? Simplemente quiero cargar un fragmento cuando el usuario hace clic en una pestaña.
Gracias por adelantado
- Android SlidingTabLayout con iconos
- El selector de iconos no funciona con PagerSlidingTabStrips
- Contenido de Viewpager perdido en rotación
- Lengüetas estilo Android SlidingTabs con esquinas redondas
- PagerSlidingTabStrip guía de implementos
- PagerSlidingTabStrip - agrega una nueva pestaña en tiempo de ejecución
- Cómo actualizar dinámicamente el elemento TITLE del visor de vistas
- Cambiar las pestañas que no funcionan al hacer clic en las pestañas con PagerSlidingTabStrips
Podría anular el evento setUserVisibleHint
del fragmento para saber si es visible para el usuario y luego cargar sus datos. Algo como lo siguiente:
boolean _areLecturesLoaded = false; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && !_areLecturesLoaded ) { loadLectures(); _areLecturesLoaded = true; } }
private boolean isLoaded =false,isVisibleToUser; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.isVisibleToUser=isVisibleToUser; if(isVisibleToUser && isAdded() ){ loadData(); isLoaded =true; } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { if(isVisibleToUser && (!isLoaded)){ loadData(); isLoaded=true; } }
- Preferencias compartidas de Android
- ¿Hay una manera fácil de convertir la aplicación Android a IPad, IPhone