Obtener fragmento por etiqueta o id de tablayout, android
Utilizo este tutorial para crear una pestaña. Y ahora tengo una recyclerview en cada fragmento y quiero notificarlos de mainactivity. Cómo acceder al adaptador en fragmento?
Yo uso esto para llamar refreshData () método en el fragmento:
- Cómo dar permiso de publish_action en Facebook usando android
- Android 1.6 & Fragmento y Tabhost
- Problemas con fragmentos de Android
- TabMode = "desplazable" no funciona
- Tratando de superponer un fragmento sobre un diseño existente
TabFragment1 tabFragment = (TabFragment1) getSupportFragmentManager().findFragmentByTag(TabFragment1.class.getSimpleName()); if (tabFragment != null) { tabFragment.refreshData(); }
Pero que devuelve nulo.
actividad principal:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout); tabLayout.addTab(tabLayout.newTab().setText("Tab1")); tabLayout.addTab(tabLayout.newTab().setText("Tab2")); final PagerAdapter adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } });
PagerAdapter:
public class PagerAdapter extends FragmentStatePagerAdapter { int mNumOfTabs; public PagerAdapter(FragmentManager fm, int NumOfTabs) { super(fm); this.mNumOfTabs = NumOfTabs; } @Override public Fragment getItem(int position) { switch (position) { case 0: TabFragment1 tab1 = new TabFragment1(); return tab1; case 1: TabFragment2 tab2 = new TabFragment2(); return tab2; case 2: TabFragment3 tab3 = new TabFragment3(); return tab3; case 3: TabFragment4 tab4 = new TabFragment4(); return tab4; default: return null; } } @Override public int getCount() { return mNumOfTabs; } }
Uno de myTabFragment:
public CardAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { RecyclerView v = (RecyclerView) inflater.inflate(R.layout.tab_fragment_1, container, false); SetupRecycleView(v); return v; } public void refreshData() { adapter.notifyDataSetChanged(); } void SetupRecycleView(RecyclerView recList) { recList.setHasFixedSize(true); LinearLayoutManager llm = new LinearLayoutManager(G.context); llm.setOrientation(LinearLayoutManager.VERTICAL); //recList.setLayoutManager(new GridLayoutManager(G.context, 2)); recList.setLayoutManager(llm); List<StructGhaza> ghazas = StructGhaza.getAllGhaza("2"); adapter = new CardAdapter(ghazas); recList.setAdapter(adapter); }
El CardAdapter:
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.GhazaViewHolder> { private List<StructGhaza> ghazas; public CardAdapter(List<StructGhaza> ghazaList) { this.ghazas = ghazaList; } @Override public int getItemCount() { return ghazas.size(); } @Override public void onBindViewHolder(GhazaViewHolder ghazaViewHolder, int position) { StructGhaza ghaza = ghazas.get(position); ghazaViewHolder.vTitle.setText(ghaza.Name); //----Load Image Glide.with(G.context) .load(ghaza.Aks) .placeholder(R.drawable.loading_spinner) .crossFade() .into(ghazaViewHolder.itemImg); //--------------- ghazaViewHolder.Rate.setRating(ghaza.Star); ghazaViewHolder.sampleLayout.setHoverView(ghazaViewHolder.hover); ghazaViewHolder.sampleLayout.addChildAppearAnimator(ghazaViewHolder.hover, R.id.tvHover, Techniques.FlipInX); ghazaViewHolder.sampleLayout.addChildDisappearAnimator(ghazaViewHolder.hover, R.id.tvHover, Techniques.FlipOutX); } @Override public GhazaViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View itemView = LayoutInflater. from(viewGroup.getContext()). inflate(R.layout.fragment_carditem, viewGroup, false); return new GhazaViewHolder(itemView); } public static class GhazaViewHolder extends RecyclerView.ViewHolder { protected TextView vTitle; protected BlurLayout sampleLayout; protected View hover; protected ImageView itemImg; protected RatingBar Rate; public GhazaViewHolder(View v) { super(v); sampleLayout = (BlurLayout) v.findViewById(R.id.sample); itemImg = (ImageView) v.findViewById(R.id.item_img); hover = LayoutInflater.from(G.context).inflate(R.layout.fragment_hover, null); vTitle = (TextView) v.findViewById(R.id.titleTv); Rate = (RatingBar) v.findViewById(R.id.rating); } } }
- Utilizar actividad o fragmento en la aplicación de Android
- Error al inflar el fragmento de clase
- Añadir fragmento al elemento de vista de lista
- Cargando el fragmento Google Maps de Google Maps administrado por ViewPager
- Cambiar de fragmento con fragmento de mapa deja una pantalla negra
- FindViewById devolver nulo en fragmento
- Android Fragments - Agregar barra de progreso
- Incapaz de reemplazar / navegar fragmentos
EDIT: Después de muchas pruebas, la respuesta anterior funciona con Android <21, pero para Android> 21 es un poco extraño, no parece funcionar de la misma manera.
Finalmente, lo solucioné así, y funciona en todas partes:
En su adaptador:
HashMap<Integer, Fragment> mPageReferenceMap = new HashMap<>(); @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); mPageReferenceMap.put(position, fragment); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mPageReferenceMap.remove(position); } public Fragment getFragment(int key) { return mPageReferenceMap.get(key); }
Y llamas a getFragment donde quieras en tu actividad así:
int index = viewPager.getCurrentItem(); ViewPagerAdapter adapter = ((ViewPagerAdapter)viewPager.getAdapter()); final YourFragment tabFragment = (YourFragment) adapter.getFragment(index);
RESPUESTA ANTERIOR:
Advertencia : en realidad no funciona con Android> 21
Yo tuve el mismo problema. Finalmente, did'nt uso id o etiqueta.
En lugar de usar:
CustomFragment customFragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_custo_tag));
utilizar esta:
CustomFragment customFragment = (CustomFragment) getSupportFragmentManager().getFragments().get(0);
Para obtener instancia de CustomFragment.
He puesto get (0) como su posición de la instancia de CustomFragment es a cero.
Encontré este problema aquí: Establecer y obtener usando una etiqueta de un fragmento en android
- Android facebook sdk publicar la alimentación a la línea de tiempo del usuario
- Error de actualización de filestream de Android Sqlite singleton db