android - studio - Cómo cargar datos de fragmento solo cuando se hace clic en su pestaña en PagerSlidingTabStrip
tabs con iconos android (2)
Puede anular el evento setUserVisibleHint
del fragmento para saber si está visible para el usuario y luego cargar sus datos. algo como seguir:
boolean _areLecturesLoaded = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !_areLecturesLoaded ) {
loadLectures();
_areLecturesLoaded = true;
}
}
Estoy usando PagerSlidingTabStrip
en mi proyecto y estoy mostrando datos en fragmentos. Es una gran biblioteca que funciona genial. Cada Fragmento consiste en conferencias de un erudito que se cargan desde un servicio web. 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 solo cuando un usuario hace clic / desliza hacia 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 android]. 1
El adaptador de buscapersonas 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, Información y Conferencias. El fragmento de 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);
}
Intenté 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
anterior y ScholarDetailPagerAdapter
null
lugar de devolver dos fragmentos. Pero eso levantó una excepción. Pensé que daría vistas vacías en el localizador ... pero por supuesto que estaba equivocado.
Para asegurarme de que Fragment carga datos cuando se hace clic en su pestaña respectiva y está visible, también he intentado anular sus siguientes eventos y escribí la llamada de carga de datos en ellos:
onResume()
No funcionó. Todavía carga datos cuando se agrega en actividadIntentó invalidar enHiddenChanged
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if(!hidden){ loadLectures(); }
}
Esto tampoco funcionó. No se cargan datos 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
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;
}
}