一、系统需求分析

启动程序后,通过登陆注册进行程序,能够进行新闻资讯的实时更新,点击新闻可以查看新闻的详细内容,在详情页点击收藏,能够将新闻添加到收藏列表中,再次点击,取消收藏,并可以通过个人信息页面设置个人的信息。

功能需求:

(1) 登陆注册

(2) 获取和更新新闻

(3) 收藏新闻

(4) 修改个人信息

应用界面:

二、系统总体设计

2.1 系统整体结构

源代码文件结构图:

2.2 数据存储设计

2.2.1用户信息E-R图

2.2.2 新闻数据E-R图

2.2.3 收藏数据E-R图

三、系统详细设计

3.1 注册功能

用户输入用户名,邮箱和密码,遍历用户表,若是用户名已存在或邮箱已注册,提醒用户重新输入,否则注册成功,返回登陆页面

3.2 登陆功能

将用户输入的用户名和密码,与数据库存储的用户表对比,完全正确则进入新闻页面

3.3 查看新闻列表

页面初始化时,向服务器请求数据,对请求到的的json数据进行解析,并包装成List,最后展示在新闻列表页面

3.4 新闻详情页面

展示新闻详情,增加一个收藏按钮,实现收藏新闻和取消收藏的功能,同步更新数据库

3.5 个人信息页面

实现修改个人信息,包括性别、居住城市和个性签名

3.6 我的收藏页面

展示收藏的新闻,点击可以查看新闻详情,并取消收藏

四、系统实现

4.1 注册功能

通过LitePal操作数据库,遍历用户表,判断用户名和密码是否正确

users = DataSupport.findAll(User.class);

register.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

for(User user: users){

if (registerName.getText().toString().equals(user.getName())||

registerMail.getText().toString().equals(user.getMail())){

flag = false;

break;

}

}

if (flag){

User user = new User();

//开始组装数据

user.setName(registerName.getText().toString());

user.setMail(registerMail.getText().toString());

user.setPassword(registerPass.getText().toString());

//保存数据

user.save();

Toast.makeText(Register.this, "注册成功", Toast.LENGTH_SHORT).show();

finish();

}else {

Toast.makeText(Register.this, "用户名或邮箱已存在!", Toast.LENGTH_SHORT).show();

}

}

});

4.2 登陆功能

//用户名和密码

name = (EditText) findViewById(R.id.login_name);

pass = (EditText) findViewById(R.id.login_password);

//登陆验证

Button login = (Button) findViewById(R.id.login_button);

login.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

List users = DataSupport.select("name","password").find(User.class);

if (!(TextUtils.isEmpty(name.getText().toString()))&&

!(TextUtils.isEmpty(pass.getText().toString()))){

for (User user:users){

if (name.getText().toString().equals(user.getName())

&& pass.getText().toString().equals(user.getPassword())){

Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();

flag = false;

Intent intent = new Intent(MainActivity.this,Index.class);

intent.putExtra("username",name.getText().toString());

startActivity(intent);

}

}

if (flag){

Toast.makeText(MainActivity.this, "账户或密码错误!", Toast.LENGTH_SHORT).show();

}

}else {

Toast.makeText(MainActivity.this, "账号密码不能为空", Toast.LENGTH_SHORT).show();

}

}

});

//注册跳转

Button main_register = (Button) findViewById(R.id.main_register_button);

main_register.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent(MainActivity.this,Register.class);

startActivity(intent);

}

});

}

4.3 查看新闻列表

4.3.1新闻列表的获取

//新闻列表的获取

lvNews = (ListView)findViewById(R.id.lvNews);

dataList = new ArrayList();

adapter = new NewsAdapter(this, dataList);

lvNews.setAdapter(adapter);

//点击列表项跳转页面

lvNews.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

Data data = dataList.get(position);

Intent intent = new Intent(Index.this, BrowseNewsActivity.class);

intent.putExtra("title",data.getTitle());

intent.putExtra("author_name",data.getAuthorName());

intent.putExtra("date",data.getDate());

intent.putExtra("pic_url",data.getThumbnail_pic_s());

intent.putExtra("content_url", data.getUrl());

startActivity(intent);

}

});

sendRequestWithOKHttp();

//下拉刷新

swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);

swipeRefresh.setColorSchemeResources(R.color.colorPrimary);

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

@Override

public void onRefresh() {

sendRequestWithOKHttp();

}

});

}

4.3.2数据的解析

private void sendRequestWithOKHttp(){

new Thread(new Runnable() {

@Override

public void run() {

try {

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()

.url("http://v.juhe.cn/toutiao/index?type=top&key=b646373d5b1b0d7628c7ae1bfae514d0")

.build();

Response response = null;

response = client.newCall(request).execute();

String responseData = response.body().string();

Log.d("测试:", responseData);

parseJsonWithGson(responseData);

} catch (IOException e) {

e.printStackTrace();

}

//更新Adapter(务必在主线程中更新UI!!!)

runOnUiThread(new Runnable() {

@Override

public void run() {

adapter.notifyDataSetChanged();

swipeRefresh.setRefreshing(false);

}

});

}

}).start();

}

private void parseJsonWithGson(String jsonData){

Gson gson = new Gson();

News news = gson.fromJson(jsonData, News.class);

List list = news.getResult().getData();

for (int i=0; i

String uniquekey = list.get(i).getUniqueKey();

String title = list.get(i).getTitle();

String date = list.get(i).getDate();

String category = list.get(i).getCategory();

String author_name = list.get(i).getAuthorName();

String content_url = list.get(i).getUrl();

String pic_url = list.get(i).getThumbnail_pic_s();

dataList.add(new Data(uniquekey, title, date, category, author_name, content_url, pic_url));

}

}

4.4 新闻详情页面

//接收传来的数据

title = getIntent().getStringExtra("title");

author_name = getIntent().getStringExtra("author_name");

date = getIntent().getStringExtra("date");

pic_url = getIntent().getStringExtra("pic_url");

content_url = getIntent().getStringExtra("content_url");

num = getIntent().getIntExtra("num",1);

//初始化布局

Toolbar toolbar = (Toolbar) findViewById(R.id.browse_toolbar);

setSupportActionBar(toolbar);

browseDL = (DrawerLayout) findViewById(R.id.browse_drawer);

ActionBar actionBar = getSupportActionBar();

if (actionBar!=null){

actionBar.setDisplayHomeAsUpEnabled(true);

}

webView = (WebView)findViewById(R.id.webView);

webView.loadUrl(content_url);

webView.getSettings().setJavaScriptEnabled(true);

webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

4.5 个人信息页面

4.5.1设置性别

//设置性别

info_gender.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

new AlertDialog.Builder(Infomation.this).setTitle("请选择你的性别")

.setItems(gender, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

info_gender.setText(gender[which].toString());

User user_gender = new User();

user_gender.setGender(gender[which].toString());

user_gender.updateAll("name = ?",info_user);

}

}).show();

}

});

4.5.2设置城市

final String[] city = new String[]{

"广州市","深圳市","清远市","韶关市","河源市","梅州市","潮州市","肇庆市",

"云浮市","佛山市","东莞市","惠州市","汕尾市","揭阳市","汕头市","湛江市",

"茂名市","阳江市","江门市","中山市","珠海市 "

};

//设置城市

info_location.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

new AlertDialog.Builder(Infomation.this).setTitle("请选择你的城市")

.setItems(city, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

info_location.setText(city[which].toString());

User user_location = new User();

user_location.setLocation(city[which].toString());

user_location.updateAll("name = ?",info_user);

}

}).show();

}

});

4.5.3编辑个性签名

final EditText motto = (EditText) findViewById(R.id.new_motto);

motto.setText(getIntent().getStringExtra("motto"));

final String alter_name = getIntent().getStringExtra("alter_name");

//修改个性签名

Button alter_motto = (Button) findViewById(R.id.alter_motto);

alter_motto.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

User user_motto = new User();

user_motto.setMotto(motto.getText().toString());

user_motto.updateAll("name=?",alter_name);

finish();

}

});

}

4.6 收藏功能

使用奇偶数实现对新闻是否被收藏的状态进行判断

FAB = (FloatingActionButton) findViewById(R.id.float_collection);

if (num%2==0){

ColorStateList colorStateList = ContextCompat.getColorStateList(getApplicationContext(),R.color.colorPrimary);

FAB.setBackgroundTintList(colorStateList);

}

//收藏

news = DataSupport.findAll(Colltects.class);

FAB.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (num%2==1){

ColorStateList colorStateList = ContextCompat.getColorStateList(getApplicationContext(),R.color.colorPrimary);

FAB.setBackgroundTintList(colorStateList);

num++;

for (Colltects conew:news){

if (title.equals(conew.getTitle())&&author_name.equals(conew.getAuthor_name())){

flag = false;

Toast.makeText(BrowseNewsActivity.this, "已收藏", Toast.LENGTH_SHORT).show();

}

}

if (flag){

Colltects coll = new Colltects(title,author_name,date,content_url);

coll.save();

Toast.makeText(BrowseNewsActivity.this, "已收藏", Toast.LENGTH_SHORT).show();

}

}else {

ColorStateList colorStateList = ContextCompat.getColorStateList(getApplicationContext(),R.color.colorAccent);

FAB.setBackgroundTintList(colorStateList);

num++;

DataSupport.deleteAll(Colltects.class,"title = ? and author_name = ?",title,author_name);

Toast.makeText(BrowseNewsActivity.this, "取消收藏", Toast.LENGTH_SHORT).show();

}

}

});

五、结论与心得体会

遇到的问题:

编辑框的样式设计

通过网上搜索,才明白需要单独设置一个样式,再让编辑框或按钮使用这个样式,通过这样,可以便捷设置样式,减少代码的重复

Json数据的解析

新闻数据的获取是通过聚合数据提供的,前期主要时间都花费在解析数据上,参考了几个案例,才明白的

AlertDialog解决多页面

通过百度了解它的使用方法,使用它,实现对性别,城市等简单信息的设置,但是不知道如何使它拥有编辑框,最终只能采取,使用一个Activity来实现个性签名的设置

用户信息的同步

百度没找到方法,只能使用最笨的不断intent传递信息,效率低下,等后续学到了别的方法,再优化了

收藏按钮的颜色变化

网上的方法看不懂,最后通过奇偶数,对收藏状态进行简单判断,后设置按钮颜色,以及相应数据库的操作

心得体会:

遇到的问题:

编辑框的样式设计

通过网上搜索,才明白需要单独设置一个样式,再让编辑框或按钮使用这个样式,通过这样,可以便捷设置样式,减少代码的重复

Json数据的解析

新闻数据的获取是通过聚合数据提供的,前期主要时间都花费在解析数据上,参考了几个案例,才明白的

AlertDialog解决多页面

通过百度了解它的使用方法,使用它,实现对性别,城市等简单信息的设置,但是不知道如何使它拥有编辑框,最终只能采取,使用一个Activity来实现个性签名的设置

用户信息的同步

百度没找到方法,只能使用最笨的不断intent传递信息,效率低下,等后续学到了别的方法,再优化了

收藏按钮的颜色变化

网上的方法看不懂,最后通过奇偶数,对收藏状态进行简单判断,后设置按钮颜色,以及相应数据库的操作

心得体会:

通过这次实验体会到一个功能完善的app需要注意的事情太多了,各种同步,数据库操作,直接的关系,同时也明白现在所学的知识不够的。目前自己仍然停留在学会如何使用已经有的方法,一旦找不到相对应的解决方法,自己就无从下手,只能采用最笨的方式,同时对系统的整体架构设计,已经各种类应该具备怎么样的设计,这些都是未来需要好好学习提高的。

本文地址:https://blog.csdn.net/weixin_45636641/article/details/107535558

android实现新闻内容显示功能,如何用Android studio开发一个实现基本功能的新闻app?——简闻(源码及教程)...相关推荐

  1. 如何用Android studio开发一个实现基本功能的新闻app?——简闻(源码及教程)

    一.系统需求分析 启动程序后,通过登陆注册进行程序,能够进行新闻资讯的实时更新,点击新闻可以查看新闻的详细内容,在详情页点击收藏,能够将新闻添加到收藏列表中,再次点击,取消收藏,并可以通过个人信息页面 ...

  2. Android源码下载教程

    文章目录 导语 国内源码资料 一.环境准备 1. Linux环境 2. JDK环境 3. 安装GIT工具 4. 安装依赖 二.安装Repo工具 三.初始化仓库 1. 创建文件夹 2. 初始化Repo ...

  3. Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解

    Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...

  4. 实时获取股票数据的android app应用程序源码分享

    From:http://www.jb51.net/article/72449.htm 本文我们分享一个实时获取股票数据的android app应用程序源码分享,可以作为学习使用,本文贴出部分重要代码, ...

  5. 精品教程--Android实战系列源码与教程

      下载源码 知识技能概要: 1. 此套为零基础源码与教程 2. 包括了Android应用开发所有技术 3. 配套2011QQ效果实现项目源码 4. 堪称最详细中文源码注释 ...... 详细介绍: ...

  6. java写脸萌_FaceLovely 本项目是一个仿安卓脸萌app应用的源码, 款非常有趣的拼脸软件,即使你不会画 android 259万源代码下载- www.pudn.com...

    文件名称: FaceLovely下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 6940 KB 上传时间: 2016-05-25 下载次数: 0 详细说明:本项 ...

  7. 直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇)

    直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇) 在当下移动直播火爆的年代,如果你曾经使用过移动端直播应用,相信会被里面那令人惊叹的礼物动画效果迷住,比如像下面这样的效果. ...

  8. 新书推荐:《Android Studio开发实战:从零基础到App上线》终章

    <Android Studio开发实战:从零基础到App上线>是一部Android开发的实战教程,由浅入深.由基础到高级,带领读者一步一步走进App开发的神奇世界. 全书共分为16章.其中 ...

  9. Android 小应用之一个activity实现简易手电筒(内附免费源码)

    Android小应用之一个activity实现简易手电筒(内附免费源码) 1.activity代码 2.xml代码 3.资源文件代码 4.源码压缩包(免费) 今天爷爷说他手机更新之后找不到手电筒了,我 ...

  10. android+显示html内容居中显示图片,Android开发中对HTML内容的显示

    摘 要 随着Android科技的发展,手机客户端接受了更多的HTML内容.本文作者采用WebView直接显示法结合人机 >> Android开发中的主题设置研究 线程在Android开发中 ...

最新文章

  1. AR设备单目视觉惯导SLAM算法综述与评价
  2. mysql完整性语言实验报告_MySQL实验报告.doc
  3. .net 内嵌 GeckoWebBrowser (firefox) 核心浏览器
  4. Linux版本之挑选适合服务器的OS发行版
  5. linux上yum最简方法安装,yum轻松简单安装配置GCC等
  6. UML类图五种关系与代码的对应关系
  7. 吐槽贴:用ELECTRA、ALBERT之前,你真的了解它们吗?
  8. 更新无限无线连接更新服务器,02-H3C WBC560多业务无线控制器软件升级操作指导...
  9. Linux 添加新硬盘
  10. Transact-SQL数据类型(文本/图形/日期和时间/货币/特定类型)
  11. ue4模型为啥这么亮_坐好了,仔细听,资深建模师介绍UE4视口中的可视化模式(一)...
  12. The L1 Median (Weber 1909)
  13. 黑盒测试用例设计方法
  14. 基于单片机的GPS开发 (five) GPS数据获取解析思路
  15. 区块链游戏导航,一个不错的生意!
  16. 金蝶旗舰版固定资产计提折旧报错‘费用分配表所引用的*是非明细的核算项目’,如何解决?
  17. 【EXLIBRIS】#小词旮旯# 005 Pupil
  18. cocos 微信小游戏 加载云端资源
  19. Pycharm中不显示latest version
  20. 快速使用 Docker 部署 Spring Boot 项目

热门文章

  1. python打印网页成pdf_python 网页转pdf
  2. python 改变图片像素值
  3. 原来这就是公文写作领导讲话稿模板
  4. 计算机驱动程序安装不了,Win7系统安装不了主板驱动的解决方法
  5. Dubbo实现分布式架构原理
  6. 实战Python轻松实现绘制词云图(附详细源码)
  7. DMG计算机,dmg文件怎么打开?dmg是什么意思?
  8. mac上谷歌浏览器添加插件显示程序包无效的解决办法
  9. Java前后端分离项目部署
  10. 【宋红康 MySQL数据库 】【高级篇】【09】InnoDB的数据存储结构