我的 java 代码中主要分为以下几个部分,adapter,api,entity,fragment,model, signup,utils,view,activity。我的 xml 代码中主要分为 layout,drawble,xml,values 几个部分。
adapter 在我的代码中起到的是一个适配器的功能,它通过接收以 List/Arraylist 形 式传来的数据,从而将这部分数据渲染到了 ui 界面上,也就是说,adapter 是数据处理逻辑 和图形界面之间的一个桥梁。我 adapter里包括 CollectAdapter,NewsAdapter,ReadAdpter, 实现了主页新闻列表,搜索新闻列表和浏览记录列表以及收藏记录列表的渲染。
我的 api 文件夹中包含 Api,ApiInterface 两个文件,实现了一个简易的 retrofit 网 络请求框架,通过 retrofit 这种集成式的网络框架,我实现了从接口网址获取数据,实现 了对 json 格式数据的转换,实现了对网络请求多线程的处理。
entity 下只有一个文件 tab,这个文件的主要功能是作为布局控件 tablayout 的一个 补充组件,以实现更好的 ui 效果。
Fragment 文件夹下有 Categories,Home,Mine,News 四个 fragment 的文件,fragment 是 嵌套在 activity 内的碎片,在某种意义上承担着与 activity 相似的功能,与前端文件进行 连接,并写出逻辑上的指令方法。
Model 中有两个文件 NewsData 和 NewsWhole,两个文件都是用来定义数据类型, NewsWhole是为了配合retrofit使用而建立的,retrofit将json文件解析后通过NewsWhole 实例化为我们在程序中能够传递运行的数据类型。而 NewsData 是包含于 NewsWhole 中的一 个数据子类,它包括了我们在之后的代码中能够用到的数据,并且 NewsData 也用于数据在 各个文件之间的传递。
signup 里面包括了 Login,MydatabaseHelper,Register,Welcome 四个文件。signup 内其实是三个与登录注册页面相关的 activity 和一个调用 database 的类,主要实现了登 录注册的页面和账号密码的存储。
View 里面只有一个文件 FixedPager,该文件是对类 viewpager 的继承,消除了滑动过 程中滑动动画对用户体验的影响,相当于优化了 android 自带类 viewpager 的效果。
这部分实现的是整个新闻 app 的主体部分,其具体详细的介绍会在新闻报告的第二大 部分中加以介绍。
这部分主要是存储了一些图片资源和风格配色类的 xml 文件,用于图形界面的设计与 美观。
这部分是每一个页面的布局文件,通过组件,框架的应用去写出每一个页面的布局。
这部分存放了一系列的风格文件,用于规范字体形式等,也通过代码的复用来减少代码 量。
这部分用 xml 文件写了一些规范性,权限性的内容,用于帮助并补充 AndroidManifest 文件的规范。
凡是在与 activity/fragment 相关的 java 的文件中,逻辑都是趋同的。首先都是 initlayout,然后在 initview,即对整体的布局和控件进行渲染,最后再 initdata,通过 一些方法获取数据,并且含有一些操控控件的方法。本次大作业我根据此共通之处在 activity/fragment 文件中基本按照这个逻辑进行了封装,以增加代码的逻辑层次性,可复 用性,可读性。
这部分内容可以看作是对于报告第一大部分的总结,也可以看作是对于报告第二大部分 的开端。我的整体的 app 的实现思路就是:首先是一个登录+注册+欢迎的页面,然后是主页 面,主页面分为“主页”和“我的”两个控件,“我的”中可以查看浏览记录,收藏记录, 并取消收藏。“主页”中集成了搜索功能,分类功能,新闻列表功能,新闻列表点进去之后 出现新闻详情页,详情页中实现文字展示,图片展示,视频展示和收藏功能。以上就是我的 整个代码结构和整个新闻 app 的实现逻辑。
本实验在本机测试上已实现所有的大作业文档中要求的功能,并且额外的实现了一定量 的附加功能。下面我将逐个功能地介绍我的具体实现。
新闻 app 的整体架构我采用 FixedPager 和 CommonTablayout 组建而成,FixedPager 是 android 自带组件 ViewPager 的子类,CommomTablayout 是 android 自带组件 Tablayout 的 子类。两者都是 github 上的开源框架,通过这两者我搭建起了最外层的“首页”“我的”的 ui 界面。“首页”中由于需要实现不同类别新闻的分类滑动实现,我采用了 Slidingtablayout 与 FixedPager 的结合,以实现了顶部导航标签栏与下部新闻列表的联动效果。下部的新闻 列表我采用了 RecyclerView 的控件实现,实现了滚动浏览的功能。这些就是整个新闻列表 的 ui 实现思路。 后端请求新闻方面,我采用了 retrofit 框架,通过开源框架 retrofit 实现了网络请求 异步线程的处理,同时实现了 json 串的解析,将 json 串中数据用于实例化为数据后,通过 适配器的构造传给了前端,实现了 ui 界面的渲染,从而正确地展示了新闻列表,并通过 intent 和 bundle 方法实现了携带数据进入新闻详情页的跳转。
在呈现新闻列表使用的 Recyclerview 的基础上,我使用了继承于 Refreshlayout 的框 架 Smartrefresh,在下拉和上拉的同时重新按照接口获取新闻,并且通过 Smartrefresh 自 带的 BezierRadar 和 Classics 特效分别实现了上拉和上拉的动态特效。
此处的实现逻辑与获取新闻列表的基本相同,由于课程组已经为我们提供了搜索接口, 所以我们只需要使用 editview 从用户端获取数据传入重写的获取新闻方法中,并同样地调 用适配器去将搜索结果渲染到列表上。
首先通过 Slidingtablayout 和 FixedPager 实现可以滑动的分类界面,每个分类中的 新闻列表的实现是通过在搜索接口中填写不同的“类别”参数。添加和删除分类时在 ui 布 局上我首先采用 BottomSheetDialogFragment 来在主页面的底部弹出弹窗页面,其中的布局 我采用了 Tabflowlayout 实现了流式布局。至于特效,我通过仿造今日头条,在 BottomSheetDialogFragment 上左右两侧各自构建了流式布局,通过两个列表之间元素的互 相转换,从而实现了“闪烁”的动态特效。
通过 intent 和 bundle 方法将网络请求的方法实现数据从 adapter 到 activity 的传 递,再通过之前写好的 ui 布局,显示新闻的来源和时间。
此功能的实现是借助 android 自带的 videoview 控件,通过将数据传来的 url 路径转 化为 uri 路径,从而开始播放视屏。在通过 android studio 自带的 MediaController 控件 实现视频的暂停与播放和快进/快退 15 秒。值得注意的是,在该功能的实现过程中,app 权 限的设置特别考究:需要添加 access_network_state 权限和自己编辑好的安全许可,否则 视频无法做到正常播放。
本地存储是我是通过借用数据库,我采用的数据库是 android studio 自带的 sqlite, 当发生浏览事件的时候,我为浏览列表中的新闻卡片设置了监听事件,当按钮被点击的时候, 该条新闻的相关数据变会被插入数据库,在本地进行存储。在记录中,在离线状态下,也可 以从数据库中调取新闻数据,实现离线访问。同时在点击事件的方法中,检查数据库中有无 同样的新闻,若是有就将其颜色置灰。
列表的渲染方式与新闻列表的渲染方式相似,区别在于获取新闻的方式不同,此功能的 实现是从数据库中获取新闻然后进行渲染。
通过选取背景和绑定数据库,我实现了简单的用户信息管理,并且实现了欢迎界面,以 给予用户更良好的体验,更具有吸引力。
本 app 部分字体通过使用 typeface 方法使字体变为行楷字体,使得 app 的用户界面变 得更为美观。