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:

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); } } } 

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

  • Cómo configurar onclick listener para un botón en un fragmento en android
  • Después de la rotación de la pantalla, findFragmentById () devuelve un fragmento, incluso si no hay tal ID dentro del diseño
  • ¿Es posible crear fragmentos manualmente con FragmentTabHost?
  • ¿Cómo crear una lista desplegable dentro de un cajón de navegación (en Android)?
  • Fragmentos androides getArguments () return null
  • Fragmentos en ViewPager son nulos después onresume
  • La transacción de fragmentos en los resultados de Android en la pantalla en blanco
  • Cómo rellenar el adaptador RecyclerView con Firebase
  • Cómo deshabilitar la captura de pantalla en Android fragmento?
  • No se puede reemplazar el fragmento dentro de la pestaña por otro fragmento
  • Asegúrese de que el nombre de clase existe, es público y tiene un constructor vacío para fragmento público con nombre de clase y constructor vacío
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.