首页 > 其他分享 >ViewPager2 应用和DiffUtil的解释

ViewPager2 应用和DiffUtil的解释

时间:2022-09-21 16:01:39浏览次数:54  
标签:解释 return int viewPager2 Override position ViewPager2 DiffUtil public

目前ViewPager2对Fragment支持只能FragmentStateAdapter,FragmentStateAdapter在遇到预加载时,
只会创建Fragment对象,不会把Fragment真正的加入到布局中,所以自带懒加载效果。

DiffUtil 可以局部刷新

ViewPager2 应用

//ViewPager2 基于 RecyclewView 实现,复制了RecyclewView的很多功能。
public class ViewPager2Activity extends AppCompatActivity {
    private ViewPager2 viewPager2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager2);

        viewPager2 = findViewById(R.id.view_page2);
        MyAdapter myAdapter = new MyAdapter();

        //滑动方向 ORIENTATION_VERTICAL 竖向  默认是横向
        //viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);

        //是否禁止用户滑动
        //viewPager2.setUserInputEnabled(false);

        //优化了预加载  ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT = -1 不进行预加载
        //viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);

        //优化了页面切换动画,还可以多个叠加-->PageTransformer
        CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
        compositePageTransformer.addTransformer(new ScaleInTransformer());
        compositePageTransformer.addTransformer(new MarginPageTransformer(10));
        viewPager2.setPageTransformer(compositePageTransformer);

        //一屏多页  展示多个pagerView
        RecyclerView recyclerView = (RecyclerView) viewPager2.getChildAt(0);
        int padding = 80;
        recyclerView.setPadding(padding, 0, padding, 0);
        recyclerView.setClipToPadding(false);

        viewPager2.setCurrentItem(1);
        viewPager2.setAdapter(myAdapter);

        //滑动监听事件
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                //滑动中
                Log.d("ViewPager2_T", "onPageScrolled-->" + "positionOffset-->" + positionOffset);
                Log.d("ViewPager2_T", "onPageScrolled-->" + "positionOffsetPixels-->" + positionOffsetPixels);
            }

            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                super.onPageScrollStateChanged(state);
            }
        });
    }

    //自定义适配器
    private String[] colors = new String[]{"#CCFF99", "#41F1E5", "#8D41F1", "#FF99CC"};

    class MyAdapter extends RecyclerView.Adapter<MyAdapter.PagerViewHolder> {

        @NonNull
        @Override
        public PagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root = LayoutInflater.from(ViewPager2Activity.this).inflate(R.layout.item_text, parent, false);
            return new PagerViewHolder(root);
        }

        @Override
        public void onBindViewHolder(@NonNull PagerViewHolder holder, int position) {
            holder.bindColor(position % colors.length);//无限循环
        }

        @Override
        public int getItemCount() {
            return Integer.MAX_VALUE; //无限循环
            //return colors.length;
        }

        public class PagerViewHolder extends RecyclerView.ViewHolder {
            //https://blog.csdn.net/m0_61544080/article/details/120642180
            private TextView mTextView;

            public PagerViewHolder(@NonNull View itemView) {
                super(itemView);
                mTextView = itemView.findViewById(R.id.tv_text);
            }

            private void bindColor(int index) {
                mTextView.setText(index + "");
                mTextView.setBackgroundColor(Color.parseColor(colors[index]));
            }
        }
    }

    //模拟滑动 --先开启  viewPager2.beginFakeDrag(); 一般配合按钮使用
    private void fakeDragBy(ViewPager2 viewPager2) {
        viewPager2.beginFakeDrag();
        if (viewPager2.fakeDragBy(100f)) {
            viewPager2.endFakeDrag();
        }
    }


    //防止没有重复使用fragment-->https://mp.weixin.qq.com/s/MOWdbI5IREjQP1Px-WJY1Q
    /*
    public class MyPagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public Fragment getItem(int position) {
            return MyFragment.newInstance(...);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }

        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    }
    */
}

item_text.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_text"
        android:layout_width="match_parent"
        android:layout_height="280dp"
        android:layout_gravity="center_horizontal"
        android:background="@color/colorPrimaryDark"
        android:gravity="center"
        android:textColor="#000000"
        android:textSize="30sp" />
</LinearLayout>

DiffUtil

//不重写
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() {
            @Override
            public int getOldListSize() {
                return oldList.size();
            }

            @Override
            public int getNewListSize() {
                return newsList.size();
            }

            @Override
            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
                return false;
            }

            @Override
            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
                return false;
            }
        });
        //会自动计算新老数据集的差异,并根据差异情况,自动调用更新数据
        diffResult.dispatchUpdatesTo(myAdapter);


//重写调用
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(mDatas, newDatas), true);
diffResult.dispatchUpdatesTo(mAdapter);

class DiffCallBack extends DiffUtil.Callback {
        private List<String> oldData, newsData;

        public DiffCallBack(List<String> old, List<String> news) {
            this.oldData = old;
            this.newsData = news;
        }

        //旧数据
        @Override
        public int getOldListSize() {
            return oldData != null ? oldData.size() : 0;
        }

        @Override
        public int getNewListSize() {
            return newsData != null ? newsData.size() : 0;
        }

        //比较新旧数据内的属性是否有相同的
        @Override
        public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
            return false;
        }

        //判断两个item内容(对象数据)是否有相同
        @Override
        public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
            return false;
        }
    }

标签:解释,return,int,viewPager2,Override,position,ViewPager2,DiffUtil,public
From: https://www.cnblogs.com/kato-T/p/16715896.html

相关文章

  • Android使用ViewPager2实现页面滑动切换
    Android使用ViewPager2实现页面滑动切换 作者:QiShare转载地址:https://juejin.cn/post/70655660992233472131.引言在很多应用中,我们经常会看到多个页面之间滑动切换......
  • sh /bin/bash^M: 坏的解释器: 没有那个文件或目录
    原因:由于windows系统下换行符为 \r\n,linux下换行符为 \n,所以导致在windows下编写的文件会比linux下多回车符号 \r。解决方案:[root@localhost~]#sed's/\r//'-i......
  • 互联网名词解释
    名词解释事务特性ACID原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)事务的四大特性ACID-知乎(zhihu.com)CAP理论分布式系统的最......
  • 对表白墙js文件的解释
    index.js1Page({23/**4*页面的初始数据5*/6data:{7xcx_appid:"",8},9HuoquDaohangLiebiao(){......
  • 对表白墙wxss的解释
    一、index.wxss1/*信息*/2.Xinxi{3display:flex;4flex-wrap:wrap;5margin:0rpx1%;6}789/*信息列表*/10......
  • 对表白墙wxml文件解释
    1<viewclass="Beijingse"style="height:100%;">2<viewclass="Xinxi">3<viewclass="XinxiLiebiao"wx:for="{{yhxinxi}}">4<view......
  • 解释 HTML5 中的元字符集
    解释HTML5中的元字符集我确定我是唯一一个不知道UTF8究竟意味着什么的人,我只知道Meta字符集是Meta字符集。所以我做了一些谷歌搜索,我发现,元元素为HTML文档提......
  • 设计模式之解释器模式
    解释器模式字面意思,也即解释某些内容的含义。这种设计模式是实际开发中最不容易用到的。比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式......
  • python的解释器
    什么是Python解释器?1.python解释器是什么?计算机的大脑是CPU,中文名叫中央处理器,它仍然不能直接处理Python语言。CPU只能直接处理机器指令语言,那是一种由0和1数字组成的......
  • 名词解释(一)
    名词解释总结微服务相关:SpringCloud各个组件:Eureka服务发现框架Ribbon进程内负载均衡器OpenFeign服务调用映射Hystrix服务降级熔断器Zuul微服务网关Config......