tabhost tab studio pestañas iconos how hacer ejemplo con como activity android android-fragments android-viewpager pagerslidingtabstrip

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:

  1. onResume() No funcionó. Todavía carga datos cuando se agrega en actividad

  2. Intentó 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; } }