文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ViewPager2+TabLayout

2023-09-04 07:44

关注

ViewPager2最显著的特点是基于RecyclerView实现,RecyclerView是目前Android端最成熟的AdapterView解决方案,这带来诸多好处:
1、抛弃传统的PagerAdapter,统一了Adapter的API/
2、通过LinearLayoutManager可以实现类似抖音的纵向滑动
3、支持DiffUitl,可以通过diff实现局部刷新
4、支持RTL(right-to-left)布局,对于一些有出海需求的APP非常有用
5、支持ItemDecorator

一、ViewPager2和ViewPager的对比:
1、ViewPager2内部实现是RecyclerView,所以ViewPager2的性能更高。
2、ViewPager2可以实现竖向滑动,ViewPager只能横向滑动。
3、ViewPager2只有一个adapter,FragmentStateAdapter继承自RecyclerView.Adapter。
而ViewPager有两个adapter,FragmentStatePagerAdapter和FragmentPagerAdapter,均是继承PagerAdapter。FragmentStatePagerAdapter和FragmentPagerAdapter两者的区别是FragmentStatePagerAdapter不可以缓存,FragmentPagerAdapter可以缓存。
4、ViewPager2模式实现了懒加载,默认不进行预加载。内部是通过Lifecycle 对 Fragment 的生命周期进行管理。ViewPager会进行预加载,懒加载需要我们自己去实现。


 

效果图:

 MainActivity

public class MainActivity extends AppCompatActivity {    private TabLayout tabLayout;    private ViewPager2 viewPager2;    private int activeColor = Color.parseColor("#ff678f");    private int normalColor = Color.parseColor("#666666");    private int activeSize = 20;    private int normalSize = 14;    private ArrayList fragments;    private TabLayoutMediator mediator;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tabLayout = findViewById(R.id.tab_layout);        viewPager2 = findViewById(R.id.view_pager);        final String[] tabs = new String[]{"关注", "推荐", "最新0", "最新1", "最新2", "最新3", "最新4", "最新5", "最新6"};        //禁用预加载        viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);        //Adapter        viewPager2.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(), getLifecycle()) {            @NonNull            @Override            public Fragment createFragment(int position) {                //FragmentStateAdapter内部自己会管理已实例化的fragment对象。                // 所以不需要考虑复用的问题                return TestFragment.newInstance(tabs[position]);            }            @Override            public int getItemCount() {                return tabs.length;            }        });        //viewPager 页面切换监听监听        viewPager2.registerOnPageChangeCallback(changeCallback);        mediator = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {            @Override            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {                //这里可以自定义TabView                TextView tabView = new TextView(MainActivity.this);                int[][] states = new int[2][];                states[0] = new int[]{android.R.attr.state_selected};                states[1] = new int[]{};                int[] colors = new int[]{activeColor, normalColor};                ColorStateList colorStateList = new ColorStateList(states, colors);                tabView.setText(tabs[position]);                tabView.setTextSize(normalSize);                tabView.setTextColor(colorStateList);                tab.setCustomView(tabView);            }        });        //要执行这一句才是真正将两者绑定起来        mediator.attach();    }    private ViewPager2.OnPageChangeCallback changeCallback = new ViewPager2.OnPageChangeCallback() {        @Override        public void onPageSelected(int position) {            //可以来设置选中时tab的大小            int tabCount = tabLayout.getTabCount();            for (int i = 0; i < tabCount; i++) {                TabLayout.Tab tab = tabLayout.getTabAt(i);                TextView tabView = (TextView) tab.getCustomView();                if (tab.getPosition() == position) {                    tabView.setTextSize(activeSize);                    tabView.setTypeface(Typeface.DEFAULT_BOLD);                } else {                    tabView.setTextSize(normalSize);                    tabView.setTypeface(Typeface.DEFAULT);                }            }        }    };    @Override    protected void onDestroy() {        mediator.detach();        viewPager2.unregisterOnPageChangeCallback(changeCallback);        super.onDestroy();    }}

activity_main关键代码

        

viewPager2可以通过设置android:orientation属性来设置切换方向,支持上下、左右切换。

TestFragment

 对应tab页面的实现效果在Fragment中进行实现。

public class TestFragment extends Fragment {    private View rootView;    public static TestFragment newInstance(String text) {        Bundle args = new Bundle();        args.putString("text", text);        TestFragment fragment = new TestFragment();        fragment.setArguments(args);        return fragment;    }    @Nullable    @Override    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        rootView = inflater.inflate(R.layout.fragment_test, container, false);        return rootView;    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        TextView textView = rootView.findViewById(R.id.text_view);        String text = getArguments() != null ? getArguments().getString("text") : null;        textView.setText(text);    }}

几个注意的点!!

看下源码tag怎么设置的,调用链如下:

FragmentStateAdapter-》onBindViewHolder-》placeFragmentInViewHolder方法
mFragmentManager.beginTransaction()                    .add(fragment, "f" + holder.getItemId())                    .setMaxLifecycle(fragment, STARTED)                    .commitNow();

(1)ViewPager 会预加载几页
(2)ViewPager 会缓存 2*n+1 页(n为设置的值)

如设置为n=1,预加载页数1页,缓存页数3页。如果当前在第一页,会预加载第二页,滑倒第二页,会预加载第三页,当滑倒第三页,第一页会销毁,第四页会加载。

来源地址:https://blog.csdn.net/u013773608/article/details/127997374

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯