基于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://www.mzph.cn/pingmian/44186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验17 开放最短路径优先OSPF

一、实验目的 1.验证OSPF协议的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证OSPF协议的作用。 四、实验步骤 1.构建网…

AutoMQ 与蚂蚁数科达成战略合作

近期&#xff0c;AutoMQ 与蚂蚁数科正式签署战略合作协议&#xff0c;将和蚂蚁数科云原生 PaaS 平台 SOFAStack 在产品研发、生态集成、市场合作、技术社区影响力等多方面开展深度合作。 AutoMQ 是业内领先的消息和流存储服务提供商&#xff0c;基于云原生基础设施重新设计了 …

解密 AI 客服:LangChain+ChatGPT 打造智能客服新时代

你需要了解 ChatGPT ChatGPT 是 OpenAI 开发的一种基于人工智能技术的自然语言处理模型。它可以通过对大量文本数据进行训练&#xff0c;自动生成高质量的回答和对话。ChatGPT 具有高效、准确、自然的特点&#xff0c;可以帮助人们更加高效地处理信息和交流。 ChatGPT 有很多…

el-from中校验,如果某一项需要另一项填写才能校验

使用validateField <el-form:model"params":rules"rules":scroll-to-error"true"ref"refrom"v-else><el-form-item label"用户姓名" prop"name"><el-input placeholder"请输入用户姓名"…

图片海报怎么做成二维码展示?二维码分享图片的制作技巧

怎么把图片的宣传海报做成二维码呢&#xff1f;在做活动或者产品宣传时&#xff0c;都会制作精美的图片海报&#xff0c;除了打印传单或者制作展板的方式来展示外&#xff0c;将海报图片生成二维码&#xff0c;通过分享二维码来实现图片海报的快速传播&#xff0c;能够有效提升…

大话光学原理:2.最短时间原理、“魔法石”与彩虹

一、最短时间原理 1662年左右&#xff0c;费马在一张信纸的边角&#xff0c;用他那著名的潦草笔迹&#xff0c;随意地写下了一行字&#xff1a;“光在两点间选择的路&#xff0c;总是耗时最少的。”这句话&#xff0c;简单而深邃&#xff0c;像是一颗悄然种下的种子&#xff0c…

After Detailer让图像自动修复

After Detailer&#xff08;简称adetailer&#xff09;是一个Stable Diffusion的自动Web-UI扩展&#xff0c;它能够自动化修复图像中的不完整部分&#xff0c;例如模糊的人脸等常见问题。在这篇文章中&#xff0c;你将了解它的工作原理、如何使用它&#xff0c;以及一些常见的使…

品牌策划学习资源全攻略:从入门到精通的推荐清单!

这里再分享一些网站书籍和杂志给大家。 TOPYS创意内容平台&#xff1a; 专注于创意内容分享&#xff0c;涵盖广告、设计、艺术等多个领域&#xff0c;是广告设计人寻找创意灵感的好去处。 Dribbble&#xff1a; 设计师社区&#xff0c;用户可以浏览到全球设计师的优秀作品&…

使用webrtc-streamer查看rtsp实时视频

1.下载webrtc-streamer 2.解压运行webrtc-streamer.exe 在浏览器访问127.0.0.1:8000&#xff0c;点击窗口可以看到本机上各窗口实时状态&#xff0c;点击摄像头可以显示摄像头画面。 5.安装phpstudy&#xff0c;并建立网站。&#xff08;具体过程自己网上搜&#xff09; 6.打开…

【探索Linux】P.38(传输层 —— TCP协议通信连接管理机制简介 | TCP连接状态转换)

阅读导航 引言一、TCP协议通信连接管理机制二、连接状态转换1. TCP状态转换图2. 状态转换过程3. 理解TIME_WAIT状态&#xff08;1&#xff09;目的和作用&#xff08;2&#xff09;状态转换&#xff08;3&#xff09;特殊情况&#xff08;4&#xff09;影响和优化 4. 理解 CLOS…

多模态大模型时代下的文档图像智能分析与处理_多模态ocr

0. 前言1. 人工智能发展历程 1.1 传统机器学习1.2 深度学习1.3 多模态大模型时代 2. CCIG 文档图像智能分析与处理论坛 2.1 文档图像智能分析与处理的重要性和挑战2.2 文档图像智能分析与处理高峰论坛2.3 走进合合信息 3. 文档图像智能分析与处理 3.1 文档图像分析与预处理3.2 …

牛市中途深度调整,一览下半场值得关注的 Solana 生态五大潜力项目

近期有关加密货币的利空消息让市场行情一度陷入了恐慌之中&#xff0c;短期利空的落地也将伴随着接下来市场的蓄势。对于投资者来说&#xff0c;现在布局超跌潜力项目不失为一个不错的机会。作为本轮牛市值得关注的两大生态&#xff0c;Solana和TON的快速发展和吸金效应&#x…

微米级触觉感知的紧凑视触觉机器人皮肤

视触觉皮肤&#xff08;VTS&#xff09;分为涂层型、标记型和热致变色型。涂层的耐磨性和空间分辨率是涂层型VTS的核心问题。近期&#xff0c;北京邮电大学方斌教授联合中国地质大学&#xff08;北京&#xff09;杨义勇教授&#xff0c;在传感器领域Q1期刊IEEE Sensors Journal…

存储相关基本知识:oss\s3\文件存储\块存储\

存储 常见的存储格式 文件存储会以文件和文件夹的层次结构来整理和呈现数据&#xff1b;块存储会将数据拆分到任意划分且大小相同的卷中;对象存储会管理数据并将其链接至关联的元数据。 DAS和SAN是基于物理块的存储方式&#xff0c;而NAS是基于文件的存储方式。 在DAS和SAN中…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页&#xff1a;电源感知等效性检查概述 ■ 第24页&#xff1a;启动低功耗&#xff08;等效性检查&#xff09;软件 ■ 第25页&#xff1a;电源感知等效性检查流程 ■ 第28页&#xff1a;电源感知等效性检查示例Do文件 电源感知等效性检查概述…

亚马逊关键词优化全攻略:自养号测评让你的产品跃居首页

常常听到亚马逊运营吐槽&#xff1a; 为啥我的产品就是上不了首页呢&#xff1f; 我的关键词要怎么优化才能排名靠前啊&#xff1f; 的确&#xff0c;每天都有无数个卖家在想方设法让自己的产品排到首页&#xff0c;所以产品的竞争激烈程度不言而喻。 我们在亚马逊运营中&a…

昇思MindSpore学习笔记6-03计算机视觉--ResNet50图像分类

摘要&#xff1a; 记录MindSpore AI框架使用ResNet50神经网络模型&#xff0c;选择Bottleneck残差网络结构对CIFAR-10数据集进行分类的过程、步骤和方法。包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型测试等。 一、概念 1.图像分类 最基础的计算…

用6000万茅台案,了解什么是外挂?

近日&#xff0c;一起涉案金额高达6000余万元的案件出现在人们视野中。此前浙江丽水云和县公安局侦破了一起非法利用软件抢购电商平台茅台酒案。 据了解&#xff0c;犯罪嫌疑人以非法牟利为目的&#xff0c;开发了抢购软件&#xff0c;以有偿原价抢购电商平台飞天茅台酒为噱头&…

Raspberry Pi 使用 Halio 实现 13Top/s AI 加速

Raspberry Pi 5 现在可以选择用于神经网络、人工智能和机器学习的 AI 协处理器。 AI 套件包含最近宣布的用于容纳 NVMe 内存驱动器的相同 M.2 HAT&#xff0c;但装载了 13Top/s Hailo-8L AI 处理器。 据 Raspberry Pi 介绍&#xff0c;连接是通过其单通道“以 8Gbit/s 的速度…

PyCharm在线版,一周使用总结!!!

前言 过去一周&#xff0c;对pycharm在线版进行了使用&#xff0c;对云原生开发工具有了全新的认识&#xff0c;云原生开发是一种现代化的软件开发和部署方法&#xff0c;它充分利用了云计算的优势&#xff0c;特别是容器化、微服务、持续集成/持续部署&#xff08;CI/CD&…