安卓基本开发 (二)listview fragment data network

复杂控件

ListView

  1. 复杂控件,包含多个单项
  2. 不像ImageView,只需设置一个图片
  3. 需要设置一组多个数据,而数据可能包括图片,文本等组合
  4. 所以,不能直接把数据设置给ListView
  5. 需要,通过Adapter,把一组多个数据适配给ListView
  6. 通常,还需要设计单项的布局

ListView定制

  1. 准备资源
    • 图片 放入 drawable
    • 字符串 放入 values.xml
  2. 设计单项布局 hotnews_item
    • 横向LinearLayout
      • 纵向LinearLayout
        • TextView 标题
        • RelativeLayout
          • ImageView + TextView 热度
          • ImageView + TextView 分享
      • ImageView 图片
  3. 新建Activity布局 activity_list
    • 加入ListView
  4. 单项数据类HotNews
    • 包含各种资源的id
    • 构造函数
    • getter setter
  5. 定制适配器 ListAdapter
    • 模板派生 ArrayAdapter
    • 构造函数 设置单项布局ID和数据列表
    • getView
      • inflate单项布局 + findView + 控件设置资源
  6. 初始化数据列表 initHotNewsList
    • 根据资源id去遍历
  7. Activity中
    • 初始化ListView,并设置Adapter

ListView优化

  1. 利用convertView缓存,不用每次都inflate
  2. 利用ListViewHolder,不用每次findView所有的子控件

ListView点击事件

  1. 在Activity中
    • setItemOnClickListener

RecyclerView

  1. 用法比ListView复杂
  2. 控制非常灵活,很好的扩展性
  3. 运行效率更高

RecyclerView定制

  1. 重用单项布局,资源,以及数据类HotNews
  2. build.gradle 中加入依赖,必须sync
    • implementation ‘androidx.recyclerview:recyclerview:1.0.0’
  3. 新建Activity和布局
    • 布局中加入RecyclerView
  4. RecyclerViewHolder
    • 构造函数findView
    • 设置资源
  5. RecyclerAdapter
    • 构造函数 设置数据列表
    • onCreateViewHolder
      • inflate单项布局
      • 初始化RecyclerViewHolder
    • onBindViewHolder 利用viewHolder, 控件设置资源
    • getItemCount 返回数据列表长度,也是单项数目
  6. Activity
    • 初始化RecyclerView,并设置布局管理器和Adapter

RecyclerView横向

  1. 修改布局管理器LinearLayoutManager的方向

RecyclerView瀑布流

  1. 修改布局管理器为StaggeredGridLayoutManager

RecyclerView点击

  1. 修改RecyclerAdapter 的 onCreateViewHolder
    • 可以单独设置每一个子控件的click
    • 获得当前点击位置 getAdapterPosition()
    • 数据变化,发出通知,让UI修改notifyDataSetChanged
    • review

  2. UI
  3. 普通UI
    • 通常设置一个数据
  4. 布局
  5. 复杂UI
    • 通常设置一组数据
    • ListView <–Adapter–> dataList

Fragment 碎片

Fragment 的一些基本知识点

  1. 可以认为是一个退化的Activity,
    • 和Activity一样,有自己的Layout和生命周期
    • 但需要依附于Activity
  2. 可以重用
  3. 静态加载,或者动态加载

简单用法

  1. 设计Fragment的Layout
    • 先放一个图片和文本
  2. 派生Fragment
    • 构造函数
    • onCreateView
      • inflate 布局
  3. 把Fragment添加到Activity
    • 静态加入Activity的布局
      • fragment
      • android:name=“自定义的Frangment类名”
    • 或者动态在代码中加入Activity
      • FragmentManager beginTransaction
      • FragmentTransaction
        • replace 替换
        • commit 提交修改

类似微信的页面切换

  1. 一个Acitivity的布局
    • Relativelayout
      • 上面放FrameLayout,用于承载Fragment
      • LinearLayout 下面四个按钮Button
  2. 4个Fragment 对应同一个Fragment类
    • onCreateView
  3. Activity
    • 按钮,切换Fragment
    • FragmentManager beginTransaction
      • FragmentTransaction
        • add 添加
        • hide 隐藏
        • show 显示
        • commit 提交修改

不同页面内容不同

  1. 先实现上面切换的功能,再修改页面内容
    • 在构造函数中把数据传入

进化UI

  1. 升级四个按钮
    • Button 换成 ImageView
  2. ImageView改变图片

任务 静态加载 Fragment

  1. 设计Fragment的Layout
  2. 派生Fragment, onCreateView中inflate布局
  3. 静态加载

动态加载 Fragment

  1. FragmentManager beginTransaction
    • FragmentTransaction
    • replace 替换
    • commit 提交修改

页面切换

  1. 设计Activity布局
    • 底部四个按钮
    • 上部FrameLayout
  2. 通过按钮切换页面

优化底部图标

  1. 优化底部图标
    1. Button 换成 ImageView
    2. ImageView改变图片
  2. 优化布局,达到微信底部栏的效果 (可以不做)
    • 加入TextView
    • 注意调整宽高

review

  1. Fragment
    • 退化的Activity
    • 有自己的layout和生命周期
    • 需要依附在Activity
  2. 依附到Activity
    • 静态加入到Activity的布局
    • 动态通过FranmentManager

持久化

三种方案

  1. 文件操作
    • 适合于对数据无结构要求的场合
  2. SharedPreference
    • 适合于简单数据,有结构要求
  3. sqlite数据库
    • 适合用户复杂的数据,多张表,并且表间有关系

SharedPreference

  1. 写入数据
  2. 读取数据

sqlite数据库

  1. 前提是学习过数据库的知识
  2. 创建,升级数据库
  3. 数据的CRUD操作

SharedPreference

  1. 写入数据
  2. 读取数据

sqlite数据库

  1. 创建
  2. 升级

CRUD 增删改查操作

  1. 增查
  2. 删改

SharedPreference保存密码(选做)

  1. 参考书上的内容
  2. 完成保存密码的操作

review

  1. SharedPreference
    • 按照 key-value 存储数据
    • 按照 key 读取 value
  2. sqlite
    • 创建和升级数据库
    • CRUD操作

网络操作

  1. 网络权限,在AndroidManifest.xml中设置
  2. 按照Http协议请求url,返回流,读取数据
    • HttpUrlConnection
    • InputStream
    • BufferedReader.readLine
  3. 多线程操作
    • 网络操作耗时,会影响UI线程(主线程)的用户体验
    • 类 Thread.start
    • 接口 Runnable.run
    • 子线程中操作完毕,如果要操作UI,比如修改图片,则要回到主线程中,runOnUiThread

JSON数据

  1. JSON教程
  2. 在线工具
  3. JSON格式
    • key-value格式
    • {}对象
    • []数组,包含多个对象
  4. key-value格式
    • key 字符串
    • value 字符串,int, bool, {}, []
  5. 解析JSON
    • JSONObject 对应 {}
    • JSONArray 对应 []
{
    "key1":"string",
    "key2":100,
    "key3":true,
    "key4":
    {
        "key1":"string"
        "key2":100
    },
    "key5":[{
        "key1":"string"
        "key2":100
    }, {
        "key1":"string"
        "key2":100
    }], 
}

获取远程图片

  1. 请求url
  2. 返回流
  3. BitmapFactory.decodeStream(inputStream)

网络操作 请求 baidu

  1. 多线程
  2. 请求url,“http://www.baidu.com”
  3. 打印日志
  4. 数据显示到UI

请求解析JSON

  1. 请求url, “http://yeyunxiaopan.xyz/api/hotnews.json”
  2. 解析json
  3. 打印日志
  4. 数据显示到UI

请求图片

  1. 请求url, “http://yeyunxiaopan.xyz/api/img/img1.png”
  2. 读取bitmap
  3. 在主线程中修改ImageView

修改ListView

  1. 把本地数据的解析改成网络数据的解析
  2. 请求url “http://yeyunxiaopan.xyz/api/hotnews.json”
  3. 图片url 需要拼接 “http://yeyunxiaopan.xyz/api” + “img/img1.png”

review

  1. 网络操作
    • 网络权限,在AndroidManifest.xml中设置
    • 网络操作耗时,会影响UI线程(主线程)的用户体验,在子线程中操作
  2. Http协议
    • HttpUrlConnection
    • InputStream
    • BufferedReader
    • BitmapFactory
  3. JSON数据
    • key-value
    • {}对象, []数组,包含多个对象
    • JSONObject 对应 {}
    • JSONArray 对应 []

修改ListView

  1. Android Studio 导入已经存在的module
    • File -> New -> Import Module
  2. 导入 testListview
    • 测试
  3. 导入 testnn
    • 测试
  4. 结合网络操作,修改testListview
    • 把本地数据的解析改成网络数据的解析
  5. news,hot等信息,请求url “http://yeyunxiaopan.xyz/api/hotnews.json”
  6. 每一张图片url 需要拼接 “http://yeyunxiaopan.xyz/api/” + “img/img1.png”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值