复杂控件
ListView
- 复杂控件,包含多个单项
- 不像ImageView,只需设置一个图片
- 需要设置一组多个数据,而数据可能包括图片,文本等组合
- 所以,不能直接把数据设置给ListView
- 需要,通过Adapter,把一组多个数据适配给ListView
- 通常,还需要设计单项的布局
ListView定制
- 准备资源
- 图片 放入 drawable
- 字符串 放入 values.xml
- 设计单项布局 hotnews_item
- 横向LinearLayout
- 纵向LinearLayout
- TextView 标题
- RelativeLayout
- ImageView + TextView 热度
- ImageView + TextView 分享
- ImageView 图片
- 新建Activity布局 activity_list
- 单项数据类HotNews
- 包含各种资源的id
- 构造函数
- getter setter
- 定制适配器 ListAdapter
- 模板派生 ArrayAdapter
- 构造函数 设置单项布局ID和数据列表
- getView
- inflate单项布局 + findView + 控件设置资源
- 初始化数据列表 initHotNewsList
- Activity中
ListView优化
- 利用convertView缓存,不用每次都inflate
- 利用ListViewHolder,不用每次findView所有的子控件
ListView点击事件
- 在Activity中
RecyclerView
- 用法比ListView复杂
- 控制非常灵活,很好的扩展性
- 运行效率更高
RecyclerView定制
- 重用单项布局,资源,以及数据类HotNews
- build.gradle 中加入依赖,必须sync
- implementation ‘androidx.recyclerview:recyclerview:1.0.0’
- 新建Activity和布局
- RecyclerViewHolder
- RecyclerAdapter
- 构造函数 设置数据列表
- onCreateViewHolder
- inflate单项布局
- 初始化RecyclerViewHolder
- onBindViewHolder 利用viewHolder, 控件设置资源
- getItemCount 返回数据列表长度,也是单项数目
- Activity
- 初始化RecyclerView,并设置布局管理器和Adapter
RecyclerView横向
- 修改布局管理器LinearLayoutManager的方向
RecyclerView瀑布流
- 修改布局管理器为StaggeredGridLayoutManager
RecyclerView点击
- 修改RecyclerAdapter 的 onCreateViewHolder
- 可以单独设置每一个子控件的click
- 获得当前点击位置 getAdapterPosition()
- 数据变化,发出通知,让UI修改notifyDataSetChanged
-
review
- UI
- 普通UI
- 布局
- 复杂UI
- 通常设置一组数据
- ListView <–Adapter–> dataList
Fragment 碎片
Fragment 的一些基本知识点
- 可以认为是一个退化的Activity,
- 和Activity一样,有自己的Layout和生命周期
- 但需要依附于Activity
- 可以重用
- 静态加载,或者动态加载
简单用法
- 设计Fragment的Layout
- 派生Fragment
- 把Fragment添加到Activity
- 静态加入Activity的布局
- fragment
- android:name=“自定义的Frangment类名”
- 或者动态在代码中加入Activity
- FragmentManager beginTransaction
- FragmentTransaction
类似微信的页面切换
- 一个Acitivity的布局
- Relativelayout
- 上面放FrameLayout,用于承载Fragment
- LinearLayout 下面四个按钮Button
- 4个Fragment 对应同一个Fragment类
- Activity
- 按钮,切换Fragment
- FragmentManager beginTransaction
- FragmentTransaction
- add 添加
- hide 隐藏
- show 显示
- commit 提交修改
不同页面内容不同
- 先实现上面切换的功能,再修改页面内容
进化UI
- 升级四个按钮
- ImageView改变图片
任务 静态加载 Fragment
- 设计Fragment的Layout
- 派生Fragment, onCreateView中inflate布局
- 静态加载
动态加载 Fragment
- FragmentManager beginTransaction
- FragmentTransaction
- replace 替换
- commit 提交修改
页面切换
- 设计Activity布局
- 通过按钮切换页面
优化底部图标
- 优化底部图标
- Button 换成 ImageView
- ImageView改变图片
- 优化布局,达到微信底部栏的效果 (可以不做)
review
- Fragment
- 退化的Activity
- 有自己的layout和生命周期
- 需要依附在Activity
- 依附到Activity
- 静态加入到Activity的布局
- 动态通过FranmentManager
持久化
三种方案
- 文件操作
- SharedPreference
- sqlite数据库
SharedPreference
- 写入数据
- 读取数据
sqlite数据库
- 前提是学习过数据库的知识
- 创建,升级数据库
- 数据的CRUD操作
SharedPreference
- 写入数据
- 读取数据
sqlite数据库
- 创建
- 升级
CRUD 增删改查操作
- 增查
- 删改
SharedPreference保存密码(选做)
- 参考书上的内容
- 完成保存密码的操作
review
- SharedPreference
- 按照 key-value 存储数据
- 按照 key 读取 value
- sqlite
网络操作
- 网络权限,在AndroidManifest.xml中设置
- 按照Http协议请求url,返回流,读取数据
- HttpUrlConnection
- InputStream
- BufferedReader.readLine
- 多线程操作
- 网络操作耗时,会影响UI线程(主线程)的用户体验
- 类 Thread.start
- 接口 Runnable.run
- 子线程中操作完毕,如果要操作UI,比如修改图片,则要回到主线程中,runOnUiThread
JSON数据
- JSON教程
- 在线工具
- JSON格式
- key-value格式
- {}对象
- []数组,包含多个对象
- key-value格式
- key 字符串
- value 字符串,int, bool, {}, []
- 解析JSON
- JSONObject 对应 {}
- JSONArray 对应 []
{
"key1":"string",
"key2":100,
"key3":true,
"key4":
{
"key1":"string"
"key2":100
},
"key5":[{
"key1":"string"
"key2":100
}, {
"key1":"string"
"key2":100
}],
}
获取远程图片
- 请求url
- 返回流
- BitmapFactory.decodeStream(inputStream)
网络操作 请求 baidu
- 多线程
- 请求url,“http://www.baidu.com”
- 打印日志
- 数据显示到UI
请求解析JSON
- 请求url, “http://yeyunxiaopan.xyz/api/hotnews.json”
- 解析json
- 打印日志
- 数据显示到UI
请求图片
- 请求url, “http://yeyunxiaopan.xyz/api/img/img1.png”
- 读取bitmap
- 在主线程中修改ImageView
修改ListView
- 把本地数据的解析改成网络数据的解析
- 请求url “http://yeyunxiaopan.xyz/api/hotnews.json”
- 图片url 需要拼接 “http://yeyunxiaopan.xyz/api” + “img/img1.png”
review
- 网络操作
- 网络权限,在AndroidManifest.xml中设置
- 网络操作耗时,会影响UI线程(主线程)的用户体验,在子线程中操作
- Http协议
- HttpUrlConnection
- InputStream
- BufferedReader
- BitmapFactory
- JSON数据
- key-value
- {}对象, []数组,包含多个对象
- JSONObject 对应 {}
- JSONArray 对应 []
修改ListView
- Android Studio 导入已经存在的module
- File -> New -> Import Module
- 导入 testListview
- 导入 testnn
- 结合网络操作,修改testListview
- news,hot等信息,请求url “http://yeyunxiaopan.xyz/api/hotnews.json”
- 每一张图片url 需要拼接 “http://yeyunxiaopan.xyz/api/” + “img/img1.png”