News App

git clone https://github.com/hjzf/news.git

项目描述:

一个Android开发基础学习阶段的新闻App实战项目

开发思路:

设计的缺陷1: 只能显示一条新闻(即写在布局文件中的那一条特定的新闻)

解决方案: 用 "一个RecyclerView标签" 代替 "ScrollView-LinearLayout-include这个复杂的嵌套结构"

效果

之前的实现方法

现在的实现方法

滚动

ScrollView

RecyclerView

垂直方向线性排列

LinearLayout

newsRecyclerView.layoutManager = LinearLayoutManager(this)

展示新闻

include

newsRecyclerView.adapter = MyAdapter(newsList)

设计的缺陷2: 新闻数据被硬编码在kotlin代码中

解决方案: 调用 聚合数据 https://www.juhe.cn/ 免费提供的新闻API, 通过网络请求获取实时的新闻数据

步骤一: 添加网络权限

步骤二: 添加http支持(高版本安卓默认仅支持https)

android:networkSecurityConfig="@xml/network_security_config"

步骤三: 使用Okhttp库和Gson库发送网络请求,并解析返回的JSON数据

dependencies {

.......

implementation 'com.squareup.okhttp3:okhttp:4.9.0'

implementation 'com.google.code.gson:gson:2.8.6'

.......

}

遇到的问题:

1. Context类型参数怎么填?

方案一 ,MainActivity 本身就是一个Context,直接填 this 或者 this@MainActivity

方案二 , parent.context (在Adapter中使用这个方案,parent是一个viewGroup)

方案三 , MyApplication.context ,这是最终的解决方案

2. ViewPager是能够通过触摸左右切换页面的,如何禁用这个功能呢?

方案一 ,自定义一个 NoScrollViewPager

3. ViewPager在跨页切换时,会出现多页闪烁的问题

方案一 ,使用 ViewPager.setCurrentItem(0, false) 代替之前的 ViewPager.currentItem = 0 即添加一个参数 false

// 给底部导航栏的菜单项添加点击事件

bottomNav.setOnNavigationItemSelectedListener {

when (it.itemId) {

// smoothScroll=false这个参数能解决切换时的多页闪烁问题

R.id.nav_home -> contentViewPager.setCurrentItem(0, false)

R.id.nav_video -> contentViewPager.setCurrentItem(1, false)

R.id.nav_user -> contentViewPager.setCurrentItem(2, false)

}

false

}

方案二,自定义一个 NewsViewPager ,这个方案用在了 TabLayout与新闻列表ViewPager的联动上

// 自定义一个viewPager : 给setCurrentItem方法设置一个默认参数false, 解决切换时的多页闪烁问题

class NewsViewPager : ViewPager {

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

override fun setCurrentItem(item: Int) {

// smoothScroll=false 这个参数能解决切换时的多页闪烁问题

super.setCurrentItem(item, false)

}

}

4. 代码中还有哪些没来得及修改的缺陷?

这些地方代码要改一下:

在HomeFragment中,要将 viewPager.adapter = activity?.supportFragmentManager?.let { Adapter(it) } 改成 viewPager.adapter = Adapter(childFragmentManager) 具体原因见 https://blog.csdn.net/allan_bst/article/details/64920076

如果代码中还有特别严重的Bug或者设计不合理的地方,欢迎提供建议

5. 如何去掉点击时的水波纹动画效果?

基本思路是将背景色设置为透明色。

去掉TabLayout的水波纹效果(其中transparent是定义的透明色):

app:tabRippleColor="@color/transparent"

去掉BottomNavigationView的水波纹效果 :

app:itemRippleColor="@color/transparent"

去掉标题栏的menu的水波纹效果 :

@color/transparent

6. 如何在RecyclerView中展示多种菜单项,比如有三张图片的新闻列表项?以及上拉加载更多的footer_view?

步骤一: 在适配器中重写 getItemViewType(position: Int) 函数,判断第position条新闻应该用哪一种列表项展示,返回viewType常量,

步骤二: 在 onCreateViewHolder 中 根据不同的viewType加载不同的列表项布局并创建对应类型的ViewHolder

步骤三: 最后在onBindViewHolder 中根据不同的ViewHolder类型进行数据绑定 。

7. TabLayout的菜单项太多显得很拥挤怎么办?

添加属性 app:tabMode="scrollable" 让标签栏能横向滑动

8. 如何实现BiliBili安卓客户端的上滑自动隐藏标题栏效果?

使用 CoordinatorLayout + AppBarLayout + app:layout_scrollFlags + app:layout_behavior 实现标题栏与新闻列表的联动效果

9. 如何播放视频?

android 原生的 VideoView 控件,我在第二个测试页面写了一个VideoView的demo,或者开源库 https://github.com/google/ExoPlayer.git

10. 如何使用数据库缓存数据?

android可以使用SQLite数据库储存一些关系型的数据。

这里尝试使用了郭神的开源库 LitePal 简化数据库的操作 ,见 https://github.com/guolindev/LitePal.git 详细的中文文档 https://blog.csdn.net/guolin_blog/category_9262963.html

使用非常方便,个人感觉比Room的开发体验还要好,强烈推荐,(注意:部分API发生了变化例如DataSupport 改成了 LitePalSupport

同时尝试了一下郭神的Glance项目 https://github.com/guolindev/Glance.git

11. 这个新闻App还有什么可以实现的?

由于缺乏后端支持,很多功能都实现不了,只能写一下界面。但是可以利用SQLite数据库实现一些本地功能例如浏览历史记录,其它更复杂的功能可以尝试写一下后端代码。

这个App用到的技术非常基础,可以尝试用一下新知识,例如用retrofit替换Okhttp,用其它方式实现底部导航栏页面切换功能,使用LiveData,...或者整个改成MVVM架构,见https://github.com/hjzf/news-mvvm.git

下次重构打算尝试一下 Jetpack Compose ,继续努力吧

典型BUG记录:

BUG描述

原因

解决方案

Permission denied (missing INTERNET permission?)

没有网络权限,加载不了来自网络的图片

lateinit property context has not been initialized

MyApplication没有注册

android:name=".MyApplication"

Unable to start activity ComponentInfo{com.app/com.app.MainActivity}: android.os.NetworkOnMainThreadException

网络请求不能放在主线程中

thread { ... }

Only the original thread that created a view hierarchy can touch its views.

不能在子线程中刷新UI

runOnUiThread { ... }

have you declared this activity in your AndroidManifest.xml?

新活动没有注册

已完成的内容

新闻类别标签栏

底部导航栏

home页面的标题栏布局

home页面中,点击搜索框打开搜索页面(注意:在代码中实现了搜索页面的内容,但是忘记录制视频)

用数据库做本地数据缓存,用到了 LitePal 和 Glance

未来还会做什么

使用Jetpack Compose 重构

android 新闻功能列表,news: 用Android基本技术实现的新闻App相关推荐

  1. android电脑文件列表不刷新,Android 利用RecyclerView.Adapter刷新列表中的单个view问题...

    首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...

  2. android实现评论列表_【Android视图效果】分组列表实现吸顶效果

    效果图 效果图 分析 先来分析一下,可以看到这是一个按月份分组的2行图片列表,列表顶部一个悬浮栏,会随着列表滑动而刷新,点击顶部栏,弹出了一个筛选框. 思路 1.列表部分 可以用RecyclerVie ...

  3. android 发帖功能,GitHub - qiaop/android-post: Android图文发帖与浏览

    Android图文发帖与浏览 简述 很多的社交类项目中都有类似论坛的发帖功能,在探索了很多的实现方式之后找到了一种最为简单的实现. 功能非常丰富,核心文件只有5个: RichEditor.java e ...

  4. Android打电话功能权限报错,Android实现简单的拨号器功能

    简易拨号器的制作方法,具体如下 一.布局构造 android:layout_width="match_parent" android:layout_height="mat ...

  5. android 新闻功能列表,Android中通过ListView的实现简单新闻列表

    Android中通过ListView的实现简单新闻列表.本文分为两个部分,第一个部分是最基础的运用ListView实现列表展示.第二个部分是运用ListView实现新闻列表的展示. 这张图片是关于控件 ...

  6. android 新闻功能列表,android根据提供的接口获取新闻列表

    查询新闻列表: 接口名称:GetNewsInfo 接口参数:(string account(账号), string pwd(密码), string newstype(新闻类型[图文新闻(传入4),图片 ...

  7. android 新闻功能列表,android listview实现新闻列表展示效果

    本文实例为大家分享了android listview列表展示效果的具体代码,供大家参考,具体内容如下 1.封装一些新闻数据 2.使用listview展示出来 3.设置条目点击事件,点击后跳转浏览器查看 ...

  8. android讨论功能,集成融云Android SDK实现在群聊/讨论组中@人的功能

    集成融云Android SDK实现在群聊/讨论组中@人的功能 可以确定的是融云SDK本身不提供@的功能,需要自定义实现. 在实现这个功能时,基本模仿微信的做法: 在列表中显示有人@了你 通知显示有人@ ...

  9. android日记本功能界面图片,基于android的日记本的设计和开发.ppt

    基于android的日记本的设计和开发 基于android的日记本的设计与开发 指导教师:闫宇帅 答辩人:廉若榕 毕业答辩 2014年5月18日 背景 手机的发展给人们的生活带来了极大的便利.以往,我 ...

最新文章

  1. 大话App测试2.0笔记2
  2. Windows10 将 YOLOX模型转换为OpenVINO需要的IR文件
  3. 医学计算机教学计划,医学院教学计划
  4. 使用Systemd包装SpringBoot应用
  5. Cloud for Customer里抓取Notification采取的是和CRM呼叫中心传统实现一样的Polling方式
  6. 7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!
  7. python 取整_马克的Python学习笔记#数字,日期和时间
  8. JVM GC日志说明
  9. 面向对象的Python编程,你需要知道这些!
  10. UI\UX实用素材模板|电子商务企业设计十大趋势
  11. 【2021团体程序设计天梯赛】L1部分(PTA,L1-073到L1-080)题解代码
  12. 【指纹识别】基于matlab GUI指纹预处理+特征点提取【含Matlab源码 1693期】
  13. 有没有不收费的恢复数据软件下载 分享人性化数据恢复工具
  14. js几种常见的设计模式
  15. 攻防世界logmein
  16. 数据库文件放在服务器哪里,服务器上数据库文件存放位置
  17. 基于jmeter+perfmon的稳定性测试记录
  18. 《Python 深度学习》刷书笔记 Chapter 8 Part-1 生成式深度学习
  19. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例
  20. 记账一段时间后,如何管理账目

热门文章

  1. 【转】从链下治理到理想治理模式
  2. 项目十大管理(六)人力资源管理
  3. 11- 移动车辆识别统计项目 (OpenCV操作指南) (项目十一) *
  4. R语言多重比较示例:Bonferroni校正法和Benjamini Hochberg法
  5. 技校计算机英语,技校计算机英语的一体化教学论文
  6. 小程序 · 手机号码中间四位隐藏
  7. IC验证必备的数字电路基础知识(一):数字逻辑基础
  8. restcontrol 注解
  9. IBM开放创新推动和谐区域医疗
  10. 宽带拨号密码查看工具