• 前言

或许很多人会说,pageradapter封装现在网上一大推,也简单,或者说viewpager2都出现了,将来不久viewpager可能会被recyclerview替代带。

今天我带来不一样的封装思路

  • 方式

  • 已有view进行封

view都已经初始化完全,在丢给viewpager。这种是比较常见的

  • 初始化view也放在viewpager里面

本文所讲的是第二种封装

  • 思路

  • 适配器需要存在一个数据接入源,和一个存储view的列表
public abstract class BasePagerAdapter<T> extends PagerAdapter {//数据源private List<T> list;//view存储private SparseArray<View> sparseArray;public BasePagerAdapter(List<T> list) {this.list = list==null?new ArrayList<T>():list;this.sparseArray=new SparseArray<>();}
}
  • 适器的长度就由数据源来确定
   @Overridepublic int getCount() {return list.size();}
  • 适配器的判断方法

   @Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object o) {return view==o;}
  • 删除view的方法
 @Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {View view = sparseArray.get(position);if (view!=null){container.removeView(view);}}
  • 添加view的方法

这里最主要要提供一个布局id方法,和一个设置数据的方法

适配的布局可能是不一样的,所以我门根据position来提供不同的布局id

    //获取布局idprotected abstract int getLayoutId(int position);

有了布局我们就可以创建view,和给view设置对应的数值

 @NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {//获取数据final T t = obtainT(position);View view=sparseArray.get(position);if (view==null){view = LayoutInflater.from(container.getContext()).inflate(getLayoutId(position), container, false);if (view!=null){//设置数值onData(view,position,t);}sparseArray.put(position,view);}view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (onItemListener!=null&&isItemClick&&ClickUtils.clickable(view)){onItemListener.onClick(BasePagerAdapter.this,view,position,true);}}});container.addView(view);return view;}//设置数值的方法protected abstract void onData(View view,int position,T t);
  • 给布局的itemview设置监听事件
/**** @author yuwenchao* @date 2018/11/15* recycler 数据类型点击事件*/public interface OnPagerItemListener {/**** @param adapter  适配器* @param view     点击的view* @param position 点击数据的position* @param itemView 是否为itemview*/void onClick(PagerAdapter adapter, View view, int position, boolean itemView);
}//适配器里面的方法private OnPagerItemListener onItemListener;//item是否可以点击private boolean isItemClick=true;public void setOnItemListener(OnPagerItemListener onItemListener) {this.onItemListener = onItemListener;}
  • 提供获取数据的方法
 protected T obtainT(int position){if (position<getCount()){return list.get(position);}return null;}protected List<T> obtainData(){return list;}
  • 完整代码

public abstract class BasePagerAdapter<T> extends PagerAdapter {private List<T> list;private SparseArray<View> sparseArray;private OnPagerItemListener onItemListener;//item是否可以点击private boolean isItemClick=true;public void setOnItemListener(OnPagerItemListener onItemListener) {this.onItemListener = onItemListener;}public BasePagerAdapter(List<T> list) {this.list = list==null?new ArrayList<T>():list;this.sparseArray=new SparseArray<>();}@Overridepublic int getCount() {return list.size();}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object o) {return view==o;}@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {View view = sparseArray.get(position);if (view!=null){container.removeView(view);}}@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {final T t = obtainT(position);View view=sparseArray.get(position);if (view==null){view = LayoutInflater.from(container.getContext()).inflate(getLayoutId(position), container, false);if (view!=null){onData(view,position,t);}sparseArray.put(position,view);}view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (onItemListener!=null&&isItemClick&&ClickUtils.clickable(view)){onItemListener.onClick(BasePagerAdapter.this,view,position,true);}}});container.addView(view);return view;}protected T obtainT(int position){if (position<getCount()){return list.get(position);}return null;}protected List<T> obtainData(){return list;}//获取布局idprotected abstract int getLayoutId(int position);protected abstract void onData(View view,int position,T t);}
  • 使用

public class a extends BasePagerAdapter<String> {public a(List<String> list) {super(list);}@Overrideprotected int getLayoutId(int position) {return R.layout.actionbar_one;}@Overrideprotected void onData(View view, int position, String s) {}
}

有什么不懂的,或者有好的提议可以添加qq 1075770029,或者加qq群127299409,欢迎大家一起讨论

自定义pageradapter相关推荐

  1. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新

    现在很多APP,如微信.QQ.微博等等,它们的主页面都无一例外的选择使用底部Tab导航, 通过这种方式,可以很好的把页面层级分化,很好的提高用户体验.相信,很多Android开发者,都使用到过这种经典 ...

  2. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  3. android 消息循环滚动条,Android ViewPager实现循环滚动

    流量预警 内含三张4M+的GIF图片,流量慎入 转载请注明出处 以下图片来源于https://pixabay.com/ gif!图片外链服务由贴图库提供 画廊效果的部分来自博客园博主@阿呆哥哥的教程 ...

  4. Android博客大汇总

    目录介绍 链接:https://juejin.im/post/5d60ad5df265da03c42899f1 01.基础组件(9篇) 02.IPC机制(7篇) 03.View原理(9篇) 04.动画 ...

  5. Android之自定义ViewPager实现图片的无线轮播

    PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...

  6. 三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。...

    (转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/lingu ...

  7. 自定义组合控件:Banner、轮播图、广告栏控件

    1. 项目概述 这里,我们使用自定义组合控件实现一个自动轮播的广告条,也叫轮播图,完整版的效果图如下图所示.其实,这就是我们经常见到的滚动广告,默认情况下每隔N 秒会自动滚动,用手指左右滑动时也会切换 ...

  8. android如何自定义viewpager,Android自定义ViewPager实现个性化的图片切换效果

    第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开始让ViewPager来做.时间长了,ViewPager的 ...

  9. Android 自定义viewpager 三张图片在同一屏幕轮播的效果

    github:https://github.com/nickeyCode/RoundImageViewPager 说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文 ...

  10. 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。

    参考自http://www.apkbus.com/android-86125-1-1.html 这篇文章技术含量一般,大家别见笑.源码我以测试,在底部可下载.    好了先上效果图: 以下是实现步骤: ...

最新文章

  1. 如何批量文件格式转化
  2. 去除浏览器ip检测_浏览器怎么多开换ip,每个窗口不同的独立IP-VMLogin中文版指纹浏览器...
  3. 类脑芯片怎么搞?三星哈佛:直接复制粘贴神经元 | Nature子刊
  4. Go 语言编程 — panic 和 recover
  5. mac系统学习和快捷键
  6. php getid3,PHP getID3类的使用方法学习笔记【附getID3源码下载】
  7. [css] 说说你对相对定位、绝对定位、固定定位的理解
  8. 工业大数据分析综述:模型与算法
  9. VB.NET自动操作其他程序(4)--读取、设置其他软件listview控件的内容
  10. 两用物项许可证办理流程_[进出口管制类]两用物项和技术进口许可证之易制毒化学品(6)欣海丁丁检务工作室(272)...
  11. 关于Android Pie(Android 9.0),你想知道的都在这了
  12. qq西游服务器制作教程,QQ西游修罗版开区一键服务端+完整客户端+GM辅助工具+教程...
  13. 九月手机无新事:头部品牌没创新,二三线品牌静悄悄
  14. android native 代码内存泄露 定位方案
  15. 最详细的Java入门完整教程,学Java先收藏了
  16. shell 知:外部命令
  17. 在安装完成AD19过后的一些基本设置
  18. 学习linux的网站
  19. 音乐制作软件Ableton Live 10 Suite Mac激活教程
  20. win10电脑日历怎么显示第几周?

热门文章

  1. 云服务器与普通服务器有哪些区别?
  2. DeFi狂欢是不是一场泡沫?两种估值方法告诉你投资者为什么继续买入
  3. pa14-30条职场经验
  4. JavaEE初阶(11)HTTP 协议(发展历程、报文格式、URL、HTTP请求详解、HTTP 响应详解、构造HTTP请求、form 表单构造、AJAX的方式构造)
  5. 三维向量与圆柱的圆心距离
  6. 小学计算机课程有些什么,小学六年级信息技术学什么
  7. 生活所迫下海创业,她做塑料产品竟把公司做到年产值1亿元
  8. 字符集和编码——Unicode(UTFUCS)深度历险
  9. 基于Java+SpringBoot+vue+element实现汽车订票管理平台详细设计和实现
  10. 嵌入式linux驱动学习-用cdev代替register_chrdev()