# 基于Android Studio实现的新闻APP
# 一、作业题目
实现一个安卓新闻类App,最低支持安卓系统版本为5.1(minSdkVersion 为API 16 https://developer.android.com/guide/topics/manifest/uses-sdk-element.html )
# 二、作业描述
互联网科技的发展让新闻的传播从报纸、广播、电视等方式发展到了网页以及最近几年兴起的手机app客户端,人们获取新闻的方式变得异常容易。手机上的新闻app让大家随时随地掏出手机即可看天下事,手机新闻app不再是一个简简单单的新闻获取工具,许多app已经利用数据挖掘构建出了新闻推荐引擎,为用户提供个性化、更有价值的新闻,例如今日头条、天天快报等。
现在让我们也来尝试一下做一个新闻app!本次大作业的任务就是实现一款新闻获取的工具类软件,其中新闻数据采用的是腾讯网的rss,同学们根据相关rss数据和作业要求利用课上所学的Java和android开发知识实现一个新闻客户端即可。
# 三、接口描述
本次大作业需要开发的系统结构如图1所示,实现了新闻内容的抓取和存储;客户端从服务器拉取新闻,是学生需要完成的部分,包括新闻频道获取、展示和管理,新闻列表的获取、展示以及刷新,新闻收藏、分享等。
中文新闻所用的rss为:http://rss.qq.com/index.html ,需要简单了解rss相关知识。
# 四、具体实现
## 4.1 新闻列表
### 4.1.1 UI
APP主界面布局xml如下:
```xml
<android.support.design.widget.CoordinatorLayout
<android.support.design.widget.AppBarLayout
<android.support.v7.widget.Toolbar/ >
<android.support.design.widget.TabLayout/ >
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager/>
</android.support.design.widget.CoordinatorLayout>
```
其中CoordinatorLayout用于协调布局中的部件的滑动,AppBarLayout用于显示标题并添加菜单,ViewPager用于显示新闻列表。
ViewPager中包含多个Fragment,每个Fragment布局xml如下:
```xml
<android.support.v4.widget.SwipeRefreshLayout
<android.support.v7.widget.RecyclerView/>
</android.support.v4.widget.SwipeRefreshLayout>
```
其中SwipeRefreshLayout用于添加下拉刷新操作,RecyclerView中以垂直线性布局的方式显示新闻条目。
RecyclerView中的新闻条目布局xml如下:
```xml
<LinearLayout android:orientation="vertical">
<TextView android:id="@+id/title"/>
<LinearLayout android:orientation="horizontal">
<TextView android:id="@+id/source"/>
<TextView android:id="@+id/datetime"/>
</LinearLayout>
</LinearLayout>
```
即每个条目分为两行,第一行为新闻标题,以较大字体显示,第二行为新闻来源和发布时间,分别位于第二行左侧和第二行右侧,以较小字体显示。
### 4.1.2 功能实现
新闻列表中主要实现了以下功能:
#### 下拉刷新获取新的新闻
该功能通过重载SwipeRefreshLayout中的onRefresh()功能实现。用户下拉页面会自动调用onRefresh()函数,app后台向服务器申请新闻数据,并更新后台的新闻列表;随后会调用Fragment的Adapter的notifyDataSetChanged函数,更新UI界面上所显示的数据。
#### 上拉加载更多旧的新闻
该功能通过给RecyclerView添加SrollListener监测用户下拉动作,当列表下拉至接近最下端时,会向后台申请更多新闻数据,并调用notifyDataSetChanged函数更新UI界面上的数据。
#### 新闻列表本地存储
该功能通过使用SQLiteOpenHelper类为app添加后台数据库,并在向服务器申请更新数据时将更新的数据放入数据库中。在app开启时会从数据库中取出新闻数据加载到内存中。
#### 新闻是否看过的灰色标记
该功能通过新闻列表中ViewHolder的onClick函数实现。当用户点击某一新闻条目时,会更改该条目的颜色为灰色。同时,阅读标记也会被更新到数据库中,下一次打开程序时灰色标记不会消失。
#### 新闻搜索
该功能通过主页面上的Menu中的条目点击实现。点击Menu中的search条目会弹出AlertDialog搜索框。搜索功能通过对后台新闻数据进行搜索实现,并将搜索到的新闻显示在search Fragment上。
|  |  |
| :----------------: | :----------------: |
| 搜索示例1 | 搜索示例2 |
### 新闻分类添加和删除操作
该功能通过主页面上的Menu中的条目点击实现。点击Menu中的category条目会弹出多选框,对需要的category进行选中即可。用户选中后点击确定,调用函数对后台选中category的数据进行更新,并调用notifyDataSetChanged函数添加和清除相关页面。

### 4.1.3 工作难点与亮点
- 页面布局,使用了比较新的控件,需要学习的东西较多。在协调TabLayout和ViewPager中碰到较多问题,包括标题不显示,ViewPager显示空白等
- 数据加载,FragmentStatePagerAdapter使用较复杂。碰到了更新后台数据前台不刷新,以及删除Fragment后页面错位的问题。通过上网查阅资料,重载getItemPosition函数得以解决。此外使用了Loader类,对数据进行加载和更新
- 新闻分类和删除操作中,对Fragment的重构析构操作较多,碰到了一些问题
## 4.2 分享功能
### 4.2.1 实现方式
通过调用Android自带的原生分享功能Active_Send实现。由于微信SDK的问题,在同时分享文本与图片上遇到一些问题:微信6.6.7版本以后无法再使用”Kdescription”进行图片与文本的共同分享。
### 4.2.2 工作难点与亮点
#### 图片URL获得方法
通过针对不同版本的android系统,重载不同的WebView的shouldInteruptRequest方法,在WebView加载网页时获取所加载资源的URL,并通过URL的所含字段判断是否为图片类型,从而直接获取图片URL。
#### 图片下载与选择问题
通过BitmapFactory类对图片通过URL进行下载并保存。在保存过程中需要动态申请外存权限,申请过程写在了重载的onCreate函数中。
#### Uri传输问题
保存图片后,由于android较高版本对权限的控制,需要使用FileProvider类对图片URI进行获取并分享。
## 4.3 收藏功能
### 4.3.1 实现方法
通过为每一个NewsItem类添加一个favorite成员变量,记录每一条NewsItem是否被收藏过。收藏内容记录在本地,并可以通过服务器进行同步。
### 4.3.2 工作难点与亮点
#### 数据更新问题
在设置收藏的时候,需要对页面进行实时刷新以便显示出最新添加的收藏。此外,需要避免数据重复的问题。
## 4.4 新闻推荐
### 4.4.1 实现方法
通过对用户阅读过的新闻与收藏的新闻进行记录,为每一个阅读与收藏记录赋予不同的权重,通过加和判断出用户对各分类的喜好顺序,排序后为用户更多推荐未阅读过的喜好顺序靠前的分类的新闻。

## 4.5 新闻评论
### 4.5.1 实现方法
通过获取用户手机mac地址将评论上传到服务器,服务器端判断是否登录,并决定显示mac地址或用户名。新闻评论自动与服务器同步。
### 4.5.2 实现难点与亮点
同步评论过程中需要对mac地址进行判断。评论显示布局需要设计。
|  | 
















收起资源包目录




























































































































共 81 条
- 1
资源评论

轨迹£
- 粉丝: 0
- 资源: 1

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
