当前课程知识点:Android应用开发基础 > 第三章 Android组件 > 3.4 Android适配器 > 3.4.2 自定义适配器
今天我们介绍自定义适配器
一般使用BaseAdapter作为父类
实现自定义的适配器
自定义适配器主要需要实现下面四个接口
1 public int getCount()方法
获取适配器中数据个数
2 public Object getItem(int position)
获取数据索引对应的数据项
3 public Object getItem(int position)
获取数据索引id
4 public View getView(int
这是最重要的几个借口
需要获取每一行Item的显示内容
对ListView列表组件来说
可以使用自定义BaseAdapter
适配器来进行数据的显示
自定义BaseAdapter的原理图如下所示
1 ListView组件
向BaseAdapter发送获取子项目视图请求
2 BaseAdapter组件
动态加载子项列表布局文件
并生成子视图View
3 BaseAdapter组件访问数据列表
并根据列表子项位置读取对应的数据
4 根据读取的数据
将子视图View的各个组件进行更新
5 将子视图View返回给ListView组件
ListView显示每一个子项
ListView的代码实现如下图所示
1 新建一个ItemBean类实现数据的聚合
(1)定义图片id数据int iPic
图片名称字符变量String strName
图片说明字符变量String strContent
图片是否被选中布尔变量bChecked
(2)定义变量的Get和Set方法
2 自定义MyBaseAdapter类
来继承BaseAdapter
实现接口方法
(1)定义上下文Context mCtx变量
定义ArrayList
(2)以新定义的变量为参数
定义MyBaseAdapter构造函数
(3)实现getCount接口
返回mArrayList.size()方法
(4)实现getItem接口
返回mArrayList.get(i)
(5)实现getItemId接口返回位置参数i
(6)实现getView接口
主要分为如下的部分
①将布局文件转化为View对象
②定义并初始化item布局文件中对应控件
③获取子项位置的ItemBean数据对象
④设置控件的对应属性值
3 数据进行初始化
(1)定义图片id数组int[] iPic
图片名称字符数组String[] strName
图片说明字符数组String[] strContent
(2)定义多列数据列表对象
ArrayList
(3)将上述定义显示的数据
一一对应添加到多列数据列表对象
(4) 适配器初始化
①定义MyBaseAdapter适配器对象
并初始化
第一个参数使用当前Activity类this
第二个使用数据列表对象mArrayList
②将MyBaseAdapter适配器对象
设置为ListView对象的适配器
4 在Activitity主视图中
重写父类AdapterView的ononItemClick方法
实现下拉框子项单击事件处理
(1) onItemClick方法有两个参数
第一个参数adapterView表示ListView组件对象
第二个参数列表组件的子项
第三个参数代表第几个子项被选中
(2) 我们使用Toast
将被选中的子项的信息进行显示
(3)使用mArrayList.get(i).getbChecked()
获取子项的单选框状态
如果被选中就提示CheckBox被选中
这就是ListView
使用自定义Adapter的全部过程
下面我们介绍自定义Adapter的优化
自定义Adapter在实现
BaseAdapter的getView方法的时候
主要存在下面的耗资源的操作
1 ListView的子视图
由布局文件转化为View对象
占用内存
IO操作影响性能
2 子视图的组件
每次需要通过findViewById查找
非常耗时
ListView的Adapter的优化思路如下
1 假设屏幕每次只能显示8个子项
Item1到Item8
2 用户滑动屏幕的过程中
Item1消失
增加Item9
3 将Item1的视图对象
通过getView参数convertView
传递给Item9
ListView不管有多少子项
只需要准备8个Item对象内存
4 生成ViewHolder对象
包括子布局的各个组件对象
5 Item子布局生成并且初始化的过程中
将子布局的各个组件对象
保存到ViewHolder对象中
并将ViewHolder对象存储到
Item的View视图的Tag对象中
6 每次设置控件的对应属性值的时候
不需要通过findViewById查找子布局的控件
节省了耗时操作
ViewHolder的实现如下图
(1) 在getView方法中选中子布局后
点击LayoutCreate方法
可以自动生成ViewHolder代码
(2) ViewHolder自动定义了属性变量
其中View rootView代表子布局视图
ImageView mImage1代表图片组件
TextView mText1代表图片名称
TextView mText2代表图片说明
CheckBox mCheckBox代表单选框
(3) ViewHolder构造函数
在初始化的过程中
将子布局的组件对象初始化
自定义Adapter优化实现getView接口
主要的步骤如下
(1)定义子视图View对象mView
和子视图组件对象mViewHolder
(2) 判断系统是否已提供子布局视图view
如果提供
直接将系统提供的子布局视图view
赋值给mView
使用view.getTag方法
将所有组件对象的值赋值给mViewHolder
(3)如果系统不提供子布局视图
使用系统动态加载器
将布局文件转换为View对象
并赋值给mView
使用mView为参数生成VIewHolder对象
将值赋值给mViewHolder
使用mView.setTag方法
将mViewHolder对象保存到mView视图中
(4)根据getView传递的参数子项位置i
使用mArrayList.get(i)
获取对应子项的数据
使用mViewHolder对象
将子项的数据分别赋值给对应的组件对象
(5)将子项视图mView传递回ListView
好 这就是使用ViewHolder
实现自定义适配器优化的全部过程
-Android Studio4.1.2安装常用问题汇总2021.3.15
-1.1 Android概述
--1.1 Android Studio安装与配置-实践案例
-1.1 Android概述--作业
-1.2 Android程序
-1.2 Android程序--作业
-1.3 Android程序调试
-1.3 Android程序调试--作业
-2.1 Activity概述
-2.1 Activity概述--作业
-2.2 Activity应用
-第2章 Android视图--2.2 Activity应用
-3.1 Activity布局
-3.1 Activity布局--作业
-3.2 Android基础组件
-3.2 Android基础组件--作业
-3.3 Android中级组件
-3.3 Android中级组件--作业
-3.4 Android适配器
-3.4 Android适配器--作业
-4.1 Fragment碎片组件
-4.1 Fragment碎片组件--作业
-4.2 ViewPager翻页类组件
-4.2 ViewPager翻页类组件--作业
-讨论:fragment与activity的生命周期有哪些不同?
-5.1 Android广播概述
-5.1 Android广播概述--作业
-5.2 Android广播工作原理
-5.2 Android广播工作原理--作业
-5.3 自定义广播
-第5章 广播--5.3 自定义广播
-5.4 有序广播
--5.4有序广播
-第5章 广播--5.4 有序广播
-6.1 系统服务概述
-6.1 系统服务概述--作业
-6.2 访问系统服务
-6.2 访问系统服务--作业
-6.3 自定义服务
-第6章 Android服务--6.3 自定义服务
-6.4 多线程
--6.4 多线程
-第6章 Android服务--6.4 多线程
-7.1 Android运行权限
-7.1 Android运行权限--作业
-7.2 URL URI概述
-第7章 内容提供者ContentProvider--7.2 URL URI概述
-7.3 ContentProvider概述
-第7章 内容提供者ContentProvider--7.3 ContentProvider概述
-7.4 访问通讯录
-第7章 内容提供者ContentProvider--7.4 访问通讯录
-7.5 课后作业案例
-8.1 相机服务
--8.1 相机服务
-8.1 相机服务--作业
-8.2 音视频服务
-8.2 音视频服务--作业
-9.1 网络服务概述
-9.1 网络服务概述--作业
-9.2 网络框架
--9.2 网络框架
-9.2 网络框架--作业
-9.3 Json
--9.3 Json
-第9章 网络技术--9.3 Json
-9.4 Volley
-第9章 网络技术--9.4 Volley
-10.1 文件存储
--10.1.3 实践案例-SharedPreference文件读写
-10.1 文件存储--作业
-10.2 数据库存储
-10.2 数据库存储--作业
-第1章 实训简介以及开发环境配置
-第2章 在线音乐播放器整体设计以及服务端开发
-第3章 在线音乐播放器-客户端开发
-第4章 在线音乐播放器-完整版
-第5章 QQ聊天项目
-第6章 在线点餐系统