自定义pageradapter
前言
或许很多人会说,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相关推荐
- Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新
现在很多APP,如微信.QQ.微博等等,它们的主页面都无一例外的选择使用底部Tab导航, 通过这种方式,可以很好的把页面层级分化,很好的提高用户体验.相信,很多Android开发者,都使用到过这种经典 ...
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
. 参考界面 : 携程app首页的广告栏, 使用ViewPager实现 自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...
- android 消息循环滚动条,Android ViewPager实现循环滚动
流量预警 内含三张4M+的GIF图片,流量慎入 转载请注明出处 以下图片来源于https://pixabay.com/ gif!图片外链服务由贴图库提供 画廊效果的部分来自博客园博主@阿呆哥哥的教程 ...
- Android博客大汇总
目录介绍 链接:https://juejin.im/post/5d60ad5df265da03c42899f1 01.基础组件(9篇) 02.IPC机制(7篇) 03.View原理(9篇) 04.动画 ...
- Android之自定义ViewPager实现图片的无线轮播
PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...
- 三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。...
(转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/lingu ...
- 自定义组合控件:Banner、轮播图、广告栏控件
1. 项目概述 这里,我们使用自定义组合控件实现一个自动轮播的广告条,也叫轮播图,完整版的效果图如下图所示.其实,这就是我们经常见到的滚动广告,默认情况下每隔N 秒会自动滚动,用手指左右滑动时也会切换 ...
- android如何自定义viewpager,Android自定义ViewPager实现个性化的图片切换效果
第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开始让ViewPager来做.时间长了,ViewPager的 ...
- Android 自定义viewpager 三张图片在同一屏幕轮播的效果
github:https://github.com/nickeyCode/RoundImageViewPager 说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文 ...
- 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。
参考自http://www.apkbus.com/android-86125-1-1.html 这篇文章技术含量一般,大家别见笑.源码我以测试,在底部可下载. 好了先上效果图: 以下是实现步骤: ...
最新文章
- 如何批量文件格式转化
- 去除浏览器ip检测_浏览器怎么多开换ip,每个窗口不同的独立IP-VMLogin中文版指纹浏览器...
- 类脑芯片怎么搞?三星哈佛:直接复制粘贴神经元 | Nature子刊
- Go 语言编程 — panic 和 recover
- mac系统学习和快捷键
- php getid3,PHP getID3类的使用方法学习笔记【附getID3源码下载】
- [css] 说说你对相对定位、绝对定位、固定定位的理解
- 工业大数据分析综述:模型与算法
- VB.NET自动操作其他程序(4)--读取、设置其他软件listview控件的内容
- 两用物项许可证办理流程_[进出口管制类]两用物项和技术进口许可证之易制毒化学品(6)欣海丁丁检务工作室(272)...
- 关于Android Pie(Android 9.0),你想知道的都在这了
- qq西游服务器制作教程,QQ西游修罗版开区一键服务端+完整客户端+GM辅助工具+教程...
- 九月手机无新事:头部品牌没创新,二三线品牌静悄悄
- android native 代码内存泄露 定位方案
- 最详细的Java入门完整教程,学Java先收藏了
- shell 知:外部命令
- 在安装完成AD19过后的一些基本设置
- 学习linux的网站
- 音乐制作软件Ableton Live 10 Suite Mac激活教程
- win10电脑日历怎么显示第几周?
热门文章
- 云服务器与普通服务器有哪些区别?
- DeFi狂欢是不是一场泡沫?两种估值方法告诉你投资者为什么继续买入
- pa14-30条职场经验
- JavaEE初阶(11)HTTP 协议(发展历程、报文格式、URL、HTTP请求详解、HTTP 响应详解、构造HTTP请求、form 表单构造、AJAX的方式构造)
- 三维向量与圆柱的圆心距离
- 小学计算机课程有些什么,小学六年级信息技术学什么
- 生活所迫下海创业,她做塑料产品竟把公司做到年产值1亿元
- 字符集和编码——Unicode(UTFUCS)深度历险
- 基于Java+SpringBoot+vue+element实现汽车订票管理平台详细设计和实现
- 嵌入式linux驱动学习-用cdev代替register_chrdev()