基于Android平台开发,仿头条新闻app

1. 项目模块功能思维导图

在这里插入图片描述

2. 项目涉及到的技术点

  1. 数据来源:聚合数据API
  2. 使用okhttp网络请求框架获取api数据
  3. 使用gson库解析json数据
  4. 使用RecyclerView+adapter实现新闻列表
  5. 使用SQLite数据库实现用户登录,注册,浏览历史记录
  6. 使用SharedPreferences 实现记住密码登录
  7. 使用TabLayout+ViewPager2实现新闻分类滑动
  8. 使用DrawerLayout+NavigationView实现抽屉
  9. 使用WebView实现新闻详情数据加载
  10. 使用Glide实现新闻图片加载

3. 项目截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3. 部分代码实现

  1. 欢迎页实现
public class WelcomeActivity extends AppCompatActivity {private TextView tvCountdown;private CountDownTimer countDownTimer;private long timeLeftInMillis = 3000; // 设置倒计时时长,单位为毫秒@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);//初始化控件tvCountdown =findViewById(R.id.tv_countdown);// 启动倒计时startCountdown();}private void startCountdown() {countDownTimer =new CountDownTimer(timeLeftInMillis,1000) {@Overridepublic void onTick(long millisUntilFinished) {timeLeftInMillis = millisUntilFinished;int secondsRemaining = (int) (millisUntilFinished / 1000);tvCountdown.setText(secondsRemaining +" s | 跳转");}@Overridepublic void onFinish() {//跳转到登录页面(看自己逻辑想跳转哪个页面)startActivity(new Intent(WelcomeActivity.this, MainActivity.class));// 倒计时结束后的操作,例如跳转到主页面finish();}}.start();}@Overrideprotected void onDestroy() {super.onDestroy();if (countDownTimer != null) {countDownTimer.cancel();}}
}
  1. 首页实现
public class MainActivity extends AppCompatActivity {//    private String[] titles = {"娱乐", "军事", "教育", "文化", "将康", "财经", "体育", "汽车", "科技"};private List<TitleInfo> titles = new ArrayList<>();private TabLayout tab_layout;private ViewPager2 viewPager;private NavigationView nav_view;private TextView tv_username;private TextView tv_nickname;private ImageView btn_open_drawerLayout;private DrawerLayout drawer_layout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化title数据titles.add(new TitleInfo("推荐", "top"));titles.add(new TitleInfo("国内", "guonei"));titles.add(new TitleInfo("国际", "guoji"));titles.add(new TitleInfo("娱乐", "yule"));titles.add(new TitleInfo("体育", "tiyu"));titles.add(new TitleInfo("军事", "junshi"));titles.add(new TitleInfo("科技", "keji"));titles.add(new TitleInfo("财经", "caijing"));titles.add(new TitleInfo("游戏", "youxi"));titles.add(new TitleInfo("汽车", "qiche"));titles.add(new TitleInfo("健康", "jiankang"));//初始化控件tab_layout = findViewById(R.id.tab_layout);viewPager = findViewById(R.id.viewPager);nav_view = findViewById(R.id.nav_view);btn_open_drawerLayout = findViewById(R.id.btn_open_drawerLayout);drawer_layout = findViewById(R.id.drawer_layout);//注意事项, 不能直接findViewById//        tv_username=findViewById(R.id.nav_view);//        tv_username = nav_view.getHeaderView(0).findViewById(R.id.tv_username);tv_username = nav_view.getHeaderView(0).findViewById(R.id.tv_username);tv_nickname = nav_view.getHeaderView(0).findViewById(R.id.tv_nickname);//btn_open_drawerLayout打开抽屉btn_open_drawerLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {drawer_layout.open();}});//nav_view点击事件nav_view.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {if (item.getItemId() == R.id.nav_history) {//跳转到历史记录Intent intent = new Intent(MainActivity.this, HistoryListActivity.class);startActivity(intent);} else if (item.getItemId() == R.id.nav_update_pwd) {//判断是否登录UserInfo userInfo = UserInfo.getUserInfo();if (null != userInfo) {startActivity(new Intent(MainActivity.this, UpdatePwdActivity.class));} else {Toast.makeText(MainActivity.this, "请先登录~~", Toast.LENGTH_SHORT).show();}} else if (item.getItemId() == R.id.nav_about) {startActivity(new Intent(MainActivity.this, AboutActivity.class));} else if (item.getItemId() == R.id.nav_exit) {UserInfo userInfo = UserInfo.getUserInfo();if (null!=userInfo){new AlertDialog.Builder(MainActivity.this).setTitle("温馨提示").setMessage("确认要退出登录吗?").setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {startActivity(new Intent(MainActivity.this, LoginActivity.class));UserInfo.setUserInfo(null);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}else {Toast.makeText(MainActivity.this, "请先登录~~", Toast.LENGTH_SHORT).show();}}return true;}});//viewPager 需要设置一个adapterviewPager.setAdapter(new FragmentStateAdapter(this) {@NonNull@Overridepublic Fragment createFragment(int position) {String title = titles.get(position).getPy_title();TabNewsFragment tabNewsFragment = TabNewsFragment.newInstance(title);return tabNewsFragment;}@Overridepublic int getItemCount() {return titles.size();}});//tab_layout点击事件tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {//设置viewPager选中当前页viewPager.setCurrentItem(tab.getPosition(), false);}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {}@Overridepublic void onTabReselected(TabLayout.Tab tab) {}});//tab_layout和viewPager关联在一起TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tab_layout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {@Overridepublic void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {tab.setText(titles.get(position).getTitle());}});//这句话一定不能少tabLayoutMediator.attach();}@Overrideprotected void onResume() {super.onResume();UserInfo userInfo = UserInfo.getUserInfo();if (null != userInfo) {tv_username.setText(userInfo.getUsername());tv_nickname.setText(userInfo.getNickname());} else {tv_username.setText("请登录");tv_nickname.setText("");//登录点击事件tv_username.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, LoginActivity.class);startActivity(intent);}});}}
}
  1. 新闻详情页
public class NewsDetailsActivity extends AppCompatActivity {private NewsInfo.ResultDTO.DataDTO dataDTO;private Toolbar toolbar;private WebView mWebView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_news_details);//初始化控件toolbar = findViewById(R.id.toolbar);mWebView = findViewById(R.id.webView);//获取传递的数据dataDTO = (NewsInfo.ResultDTO.DataDTO) getIntent().getSerializableExtra("dataDTO");//设置数据if (null != dataDTO) {toolbar.setTitle(dataDTO.getTitle());mWebView.loadUrl(dataDTO.getUrl());//添加历史记录String dataDTOJson = new Gson().toJson(dataDTO);UserInfo userInfo = UserInfo.getUserInfo();if (userInfo!=null){HistoryDbHelper.getInstance(NewsDetailsActivity.this).addHistory(userInfo.getUsername(),dataDTO.getUniquekey(),dataDTOJson);}else {HistoryDbHelper.getInstance(NewsDetailsActivity.this).addHistory(null,dataDTO.getUniquekey(),dataDTOJson);}}//返回toolbar.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225741.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】基础语法体系:break,continue,pass语句详讲

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言break 语句实例 continue 语句实例 pass 语句实例 前言 接着上一章的知识&#xff0c;我们这一章继续来讲讲语句的相关知识&#xff0c;在Python中&#xff0c;break、contin…

数据库|实践干货!实现tiup与prometheus迁移

一、背景 由于规划变动&#xff0c;需要将tiup和prometheus移动到其他的机器上&#xff0c;要求平滑迁移&#xff0c;不丢失监控数据。 关于prometheus的数据迁移《迁移prometheus数据》&#xff08;https://tidb.net/blog/1ea36c1f?shareIdba5da793&#xff09;这篇专栏文章…

关于《中国PostgreSQL考试认证体系》通知

为响应国家大数据战略发展的号召&#xff0c;进一步推动PostgreSQL开源数据库在国内的快速发展&#xff0c;加强PostgreSQL 数据库相关人才培养&#xff0c;由政府相关部门批准发起&#xff0c;组成中国PostgreSQL认证考试中心及PostgreSQL 中国大学&#xff0c;旨在共同规范和…

MUNIK解读ISO26262 : 硬件架构评估及FMEDA(系统级)

前言 功能安全领域硬件层面的核心安全活动---FMEDA&#xff08;Failure Modes Effects and Diagnostic Analysis&#xff09;一直受到功能安全工程师的广泛关注&#xff01;作为定量分析的安全分析方法&#xff0c;FMEDA涉及到了复杂的计算公式和大范围的数据处理。 为何做FME…

Python 中什么是递归函数,如何编写递归函数?

递归是计算机科学中的一种基本概念&#xff0c;它指的是函数调用自身的编程技巧。在Python中&#xff0c;递归函数是一种通过调用自身来解决问题的函数。这种方法常用于解决可以被分解为较小相同问题的场景&#xff0c;例如阶乘计算、斐波那契数列、全排列生成等。 一、递归的…

Clustalw/Clustalx使用过程中需要注意的问题——待补充

序列比对软件clustalx无法加载序列 路径中不能有中文字符关于下载Index of /download/current 还是下载windows版本的clustalx吧&#xff0c;linux的不好安装。

上传图片,base64改为文件流,并转给后端

需求&#xff1a; html代码&#xff1a; <el-dialog v-model"dialogPicVisible" title"新增图片" width"500"><el-form :model"picForm"><el-form-item label"图片名称&#xff1a;" :label-width"10…

Mac怎么录屏带声音,学会这2种方法,轻松解决

在数字化时代&#xff0c;录屏已经成为我们工作、学习和娱乐中不可或缺的一部分。对于Mac用户来说&#xff0c;Mac怎么录屏带声音是一个非常实用又重要的操作&#xff0c;无论是为了保存会议内容、制作教学视频还是为了录制游戏视频&#xff0c;这一功能都能为我们提供极大的便…

JavaScript 模拟光标全选选中一段文字

在JavaScript中&#xff0c;如果你想要通过编程方式选择一段文本&#xff0c;你可以使用window.getSelection()和Range对象。以下是一个简单的例子&#xff0c;展示了如何使用这些对象来选中页面上的特定文本节点&#xff1a; function selectText(node) {if (window.getSelect…

【ai_agent】从零写一个agent框架(四)用rust制作一个python的虚拟运行环境。

前言 为了增加框架的扩展性和适用性&#xff0c;我们要能够在流程节点中运行python脚本。 这个时候需要考虑几个问题&#xff1a; 1 为什么是python&#xff1f; 思考&#xff1a;老实说我并不喜欢python&#xff0c;我更倾向于lua这种短小轻快的脚本。在我之前写的规则引擎…

回归分析(一)

回归分析&#xff08;一&#xff09; 变量间关系的度量 函数关系&#xff1a;变量之间存在一一对应的确定关系&#xff0c;可能是线性函数关系&#xff0c;也可能是非线性函数关系 相关关系&#xff1a;变量之间存在不确定的数量关系&#xff0c;不能用函数关系描述&#xff0…

Sentieon 软件快速入门指南

Sentieon软件为完整的纯软件基因变异检测二级分析方案&#xff0c;其分析流程完全忠于BWA、GATK、MuTect2、STAR、Minimap2、Fgbio、picard等金标准的数学模型。在匹配开源流程分析结果的前提下&#xff0c;大幅提升WGS、WES、Panel、UMI、ctDNA、RNA等测序数据的分析效率和检出…

海外多语言盲盒APP系统开发

随着盲盒的全球化发展&#xff0c;盲盒已经成为了一个热门行业&#xff0c;不仅深受我国消费者的青睐&#xff0c;更是深受海外消费者的喜爱。目前&#xff0c;盲盒出海已经成为了企业拓展市场的新机会。 在数字化时代&#xff0c;海外盲盒APP为企业提供了一个快速打开海外盲盒…

开放式耳机音质哪个品牌的好?盘点几款音质好品牌

在音乐的世界里&#xff0c;每一分贝的振动都承载着情感与故事。对于追求极致音质体验的我们来说&#xff0c;耳机不仅是聆听的工具&#xff0c;更是通往音乐灵魂深处的桥梁。而开放式耳机&#xff0c;以其独有的声学构造和听觉享受&#xff0c;引领我们进入一个更为开阔的音乐…

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物?

UV胶&#xff0c;它是否有毒&#xff1f;如同那些隐藏在黑暗中的危险之物&#xff1f; 关于uv胶的毒性问题&#xff0c;或许我们可以这样深入探讨。UV胶&#xff0c;如同一位戴着神秘面纱的访客&#xff0c;在我们的生活中悄然出现&#xff0c;却带着诸多疑问。那么&#xff0…

[AI 大模型] Nvidia NeMo

文章目录 [AI 大模型] Nvidia NeMo简介模型架构发展历程新技术和优势示例 [AI 大模型] Nvidia NeMo 简介 Nvidia NeMo 是一个端到端的云原生框架&#xff0c;专为开发、定制和部署生成式 AI 模型而设计。 NeMo 支持大语言模型&#xff08;LLMs&#xff09;、多模态模型、计算…

复现MiDAS文章:文章数据和代码

介绍 MiDAS 4: A global catalogue of full-length 16S rRNA gene sequences and taxonomy for studies of bacterial communities in wastewater treatment plants 提供了全套的代码和数据&#xff0c;方便大家复现&#xff1a; github: https://github.com/ msdueholm/MiD…

K8S中部署 Nacos 集群

1. 准备 GitK8Skubectlhelm 咱也没想到 K8S 部署系列能搞这么多次&#xff0c;我一个开发天天干运维的活&#xff0c;前端后端运维测试工程师实至名归。 2. 方案选择 https://github.com/nacos-group/nacos-k8s 我替你们看了一下&#xff0c;有好几种方式能部署&#xff…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现(7000字论文参考+源码+LW+部署讲解)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…