从tablayout通过标签或id获取片段,android [英] get fragment by tag or id from tablayout ,android

查看:72
本文介绍了从tablayout通过标签或id获取片段,android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用本教程创建标签. 现在我在每个片段中都有一个recyclerview,我想从mainactivity通知他们.如何访问片段中的适配器?

i use this tutorial for creating tab. and now i have a recyclerview in each fragment and i want to notify them from mainactivity. how to access the adapter in fragment?

我用它来在片段中调用refreshData()方法:

i use this for calling refreshData() method in fragment:

  TabFragment1 tabFragment = (TabFragment1) getSupportFragmentManager().findFragmentByTag(TabFragment1.class.getSimpleName());
 if (tabFragment != null) {
                    tabFragment.refreshData();
                } 

但是返回空值.

mainActivity:

mainActivity:

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:

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

myTabFragment之一:

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

CardAdapter:

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

推荐答案

经过多次测试,先前的答案适用于Android< 21,但是对于Android> 21来说有点奇怪,它似乎无法以相同的方式工作.

After many test, the previous answer work with Android < 21, but for Android > 21 it's little bit weird, it doesn't seems to work in the same way.

最后,我像这样解决了它,它在任何地方都有效:

Finally, I solved it like that, and it works everywhere:

在适配器中:

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

在这样的活动中,您可以在需要的地方调用getFragment:

And you call getFragment where you want in your activity like that:

int index = viewPager.getCurrentItem();
ViewPagerAdapter adapter = ((ViewPagerAdapter)viewPager.getAdapter());
final YourFragment tabFragment = (YourFragment) adapter.getFragment(index);


上级答案:

警告:不适用于Android> 21

Warning : it doesn't really work with Android > 21

我有同样的问题.最后,我没有使用ID或标签.

I had the same problem. Finally, i did'nt use id or tag.

代替使用:

CustomFragment customFragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_custo_tag));

使用此:

CustomFragment customFragment = (CustomFragment) getSupportFragmentManager().getFragments().get(0);

获取CustomFragment的实例.

to get instance of CustomFragment.

我把get(0)放到你的CustomFragment实例的位置为零的位置上.

I have put get(0) as your position of CustomFragment instance is at zero.

我在这里发现了这个问题: 在android中设置并使用标签片段

I found this issue here: Set and get using tag a fragment in android

这篇关于从tablayout通过标签或id获取片段,android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆