Android体育新闻app

一、项目介绍与效果展示

本项目实现的是Android平台下的体育新闻类型app,名称叫做腾飞体育。
主要功能:
(1)开场动画
(2)用户注册功能
(3)用户登录功能
(4)新闻列表
(5)新闻详细内容
(6)收藏新闻
(7)收藏列表
(8)用户个人信息

该app通过网络获取到网易体育新闻提供的api数据接口并解析,最终呈现到新闻列表中给用户浏览,用户可以点击想要查看的文章跳转到该文章的内容页面并收藏文章。用户的个人信息及新闻的收藏信息都存储在Android的sqlite数据库中。

最终效果图:
开场动画图登录页面图
新闻列表页面图新闻内容页面图
收藏列表页面图个人信息页面图

二、内容介绍

本app的系统设计基于MVC架构思想,可分为三大层:用户界面,控制器,业务模型(数据库)。

  1. 数据库层中设计了两张表,分别是user表(存储用户的个人信息)、collection表(存储用户收藏的文章信息)。对数据库的创建及crud操作采用LitePal类(对象关系映射框架)来完成。上述两张表对应的实体类分别是User类和Collection类。这两个类的属性分别对应各自表中的字段。
  2. 用户界面层主要实现了6个页面,它们分别是用户登录页面(activity_login.xml)、用户注册页面(activity_register.xml)、新闻列表页面(activity_news_list.xml)、新闻文章内容页面(activity_browse_news.xml)、个人收藏页面(activity_collection.xml)、个人信息页面(activity_profile.xml)
  3. 控制器层主要实现列表页面到文章页面的跳转、收藏列表页面到文章页面的跳转、新闻列表页面中数据的呈现以及收藏列表页面中数据的呈现。它们分别对应NewsAdapter类和CollAdapter类。

三、核心功能描述与代码

3.1 用户注册功能

获取用户在输入框中填写的数据并将其插入到数据库用户表中。

核心代码:

// 查询数据库用户表全部数据并获取每一条的name和mail数据
List<User> users = LitePal.select("name", "mail").find(User.class);
/* 遍历查询到的数据集合,判断用户名或邮箱是否已经被注册过,如果注册过则flag=false	*/
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(registerPwd.getText().toString());
    user.save();        // 向数据库user表中插入该条数据
    Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
    finish();
} else {
    Toast.makeText(RegisterActivity.this, "用户名或邮箱已被注册", Toast.LENGTH_SHORT).show();
}

3.2 用户登录功能

获取用户在输入框中填写的用户名和密码,查询数据库用户表判断是否有该用户,如果有则跳转到首页新闻列表并传递当前登录用户的用户名,如果没有则不进行跳转并提示用户登录失败。

核心代码:

// 查询数据库user表中name和password字段数据
List<User> users = LitePal.select("name", "password").find(User.class);
if(!(TextUtils.isEmpty(loginName.getText().toString())) && !(TextUtils.isEmpty(loginPwd.getText().toString()))) {
    for (User user : users) {
        // 查询数据库用户表判断是否有该用户
        if(loginName.getText().toString().equals(user.getName()) &&
            loginPwd.getText().toString().equals(user.getPassword())) {
            Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
            // 跳转页面并保存该用户的用户名
            Intent intent = new Intent(LoginActivity.this, IndexActivity.class);
            GlobalData.setUsername(loginName.getText().toString());     // 用户名保存到全局变量中
            intent.putExtra("username", loginName.getText().toString());
            startActivity(intent);      // 跳转
            finish();
            break;
        }
    }

3.3 首页新闻列表

请求提供新闻数据的网址,抓取其返回的响应体中的json字符串并解析得到每条新闻的标题、作者、发布时间、文章地址、图片资源地址,最终将这些属性封装成新闻数据类(NewsData)并添加到新闻数据集合类(List)中通过控制器层(CollAdapter)呈现到页面中。

核心代码:
1)从网络中获取并解析数据

OkHttpClient client = new OkHttpClient();
// 通过builder创建出要访问的http请求
Request request = new Request.Builder()
        .url("https://c.3g.163.com/nc/article/list/T1348649079062/0-20.html")
        .build();
// 发送请求并获取响应
Response response = client.newCall(request).execute();
/*获取服务器返回的json字符串 */
String responseData = response.body().string();

2)解析响应体中的json字符串信息

// 使用gson进行解析
Gson gson = new Gson();
News news = gson.fromJson(jsonStr, News.class);
List<NewsData> dataList = news.getData();
 // 遍历每一个新闻数据类对象,将其添加到新闻数据集合中
for (int i = 0; i < dataList.size(); i++) {
    String sourceId = dataList.get(i).getSourceId();
    String title = dataList.get(i).getTitle();
    String time = dataList.get(i).getTime();
    String source = dataList.get(i).getSource();
    String url = dataList.get(i).getUrl();
    String imgUrl = dataList.get(i).getImgUrl();

    // 过滤掉文章URL为空的数据
    if(url != null && !("".equals(url))) {
        // 将解析的一条新闻的每一个属性封装成NewsData类添加到集合中(更新adapter中newsDataList的数据)
        newsDataList.add(new NewsData(sourceId, title, time, source, url, imgUrl));
    }
}

3)在主线程中更新新闻列表页面数据

// 更新 adapter即新闻页中数据(必须在主线程中更新UI)
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        newsAdapter.notifyDataSetChanged();     //主动通知adapter中数据更新从而更新视图
        swipeRefresh.setRefreshing(false);      // 停止刷新动画
    }
});

3.4 新闻文章内容

通过WebView组件访问新闻列表页面传来的URL文章地址渲染出网页。

核心代码:

webView = findViewById(R.id.webView);
webView.loadUrl(url);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

3.5 我的收藏列表

通过查询数据库收藏表(collection表)中属于当前登录用户收藏的新闻数据并通过控制器将这些数据呈现到页面中。

核心代码:

// 查询当前用户的收藏数据
String username = GlobalData.getUsername();
collectionList = LitePal.select("title", "author_name", "date", "url").where("username = ?", username).find(Collection.class);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
CollAdapter collAdapter = new CollAdapter(collectionList, CollectionActivity.this);
recyclerView.setAdapter(collAdapter);

3.6 个人信息

通过查询数据库用户表(user表)中当前登录用户的个人信息数据。

核心代码:

List<User> users = LitePal.findAll(User.class);
	for (User user : users) {
    	if(userName.equals(user.getName())) {
        	info_name.setText(user.getName());
        	info_gender.setText(user.getGender());
        	info_mail.setText(user.getMail());
        	info_location.setText(user.getLocation());
    }
}

四、源代码

本项目已上传至仓库,点击下方链接获取源码。代码中包含详细注释,希望能够帮助到大家,欢迎点赞、收藏~

腾飞体育app源码

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值