zoukankan      html  css  js  c++  java
  • 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);
        }
    
  • 相关阅读:
    解决winfrom下TextBox不支持透明背景色
    C# Winform 怎么让按钮在Panel里居中显示
    DevExpress Cpicturebox或者Dev控件 PictureEdit 按比例的缩放加载图片
    Alluxio : 开源分布式内存文件系统
    yarn cluster和yarn client模式区别——yarn-cluster适用于生产环境,结果存HDFS;而yarn-client适用于交互和调试,也就是希望快速地看到application的输出
    Linux 反弹shell(二)反弹shell的本质
    浅谈摄像头有关的安全问题
    pyspark AttributeError: 'NoneType' object has no attribute 'setCallSite'
    大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践
    pyspark minHash LSH 查找相似度
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/13636569.html
Copyright © 2011-2022 走看看