Android 开发学习进程0.21 tablayout+viewpager+fragment

tablayout+fragment+viewpager的简单使用

这是一种经典布局方式,同时使用频率非常高。首先说fragmentpagerviewadapter,同样的还有fragmentstateviewpageradapter,前者适用于少量fragment,会缓存三个fragment,复用率高,在界面少的时候建议使用。
实现思路为 1将fragment用getsupportfragemnt加入到adapter中,2将adapter加入到view pager中,最后将tablayout与viewpager关联,一个简单的例子代码如下,在oncreate方法中:

mAdapter=new MinePagerAdapter(this,getSupportFragmentManager(),viewpagerAcMain);
        viewpagerAcMain.setAdapter(mAdapter);
        tabLayout.setupWithViewPager(viewpagerAcMain);
 mAdapter.setFragment(fragments);
        for (int i = 0; i <tabLayout.getTabCount(); i++) {
            TabLayout.Tab tab=tabLayout.getTabAt(i);
            assert tab != null;
            tab.setCustomView(mAdapter.getCustomView(i,tabLayout));
        }
        viewpagerAcMain.setCurrentItem(0);

如果要设置tablayout点击标题栏变色请设置tablayout的监听statechange方法。
关于setfragment方法,解释一下,使用setfragment是adapter中写的方法,是为了获取fragment时销毁重建新的fragment,达到强制刷新数据的结果,但是有损于界面渲染速度。adapter代码如下。同时在adapter中写tablayout的view获取方法,getcumstomview,填充tablayout的界面。如果你没有数据刷新的需求,可以直接在adapter的getItem继承方法中使用switch切换fragment简单实现。

public class MinePagerAdapter extends FragmentPagerAdapter {
    Context mContext;
    List<Fragment> fragments=new ArrayList<>();
    FragmentManager fm;
    ViewPager viewPager;
    public MinePagerAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }
    public MinePagerAdapter(Context context, FragmentManager fm, ViewPager viewPager) {
        super(fm);
        this.mContext=context;
        this.fm=fm;
        this.viewPager=viewPager;
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }
    @Override
    public int getCount() {
        return fragments.size();
    }
    public void setFragment(List<Fragment> fragments) {
        if (this.fragments != null) {
            FragmentTransaction ft=fm.beginTransaction();
            for (Fragment fragment : fragments) {
                this.fragments.remove(fragment);
            }
            ft.commit();
            ft=null;
            fm.executePendingTransactions();
        }
        this.fragments=fragments;
        notifyDataSetChanged();
    }

    public View getCustomView(int position, TabLayout tabLayout) {
        Context context=mContext;
        View view=null;
        view= LayoutInflater.from(context).inflate(R.layout.item_tab_act_main,tabLayout,false);
        ImageView image=view.findViewById(R.id.im_tab);
        switch(position){
            case 0:
                image.setBackgroundResource(R.drawable.ic_start);
                break;
            case 1:
                image.setBackgroundResource(R.drawable.ic_start);
                break;
            case 2:
                image.setBackgroundResource(R.drawable.ic_start);
                break;
        }
        return view;
    }
}

如果在其他fragment中想设置跳转其他fragment的方式,在activity中实现方法

public void setPageCurrent(int position) {
        viewpagerAcMain.setCurrentItem(position);
    }

Android 开发学习进程0.21 tablayout+viewpager+fragment

上一篇:阿里云为地产行业提供抗“疫”解决方案


下一篇:观点 | 阿里云:文旅业战“疫”,冰冻期如何自救?