在这里插入图片描述

三三要成为安卓糕手
引入:在上一篇文章中我们完成了新闻展示页面多布局案例的展示,感悟颇多,本篇文章,继续去开发一些新的功能

一:关闭广告

所有的view都可以和我们的用户做交互,循环视图中也给我们提供了相应的点击监听器

这是对整体做点击监听——缺点就是无法对内部单个控件进行监听

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:需求

点击关闭广告的字样后,广告关闭

思路:我们要找到广告对应的ViewHolder,在内部去找控件,进行监听,并处理关闭移除逻辑666

public class AdViewHolder extends RecyclerView.ViewHolder {private final ImageView ivPicture;private final View ivClose;public AdViewHolder(@NonNull View itemView) {super(itemView);ivPicture = itemView.findViewById(R.id.iv_picture);ivClose = itemView.findViewById(R.id.tv_close);ivClose.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int layoutPosition = getLayoutPosition();articles.remove(layoutPosition);notifyItemRemoved(layoutPosition);}});}}

isClose对应的关闭广告这个控件,设置监听器,这里我们的Holder已经和position关联起来,此时在AdViewHolder中可以直接通过getLayoutPosition方法获取对应行号,战斗爽!

找到后,在数据源中直接移除(Position和index的位置恰好是一一对应的bro,在刷新一下item就OK了,思路还是非常清晰的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二:设置点击图片后跳转

问题:我现在点击广告,想要做的是跳转到广告页,或者是某个新闻的页面怎么做

以一张图片的为例,点击整个item都会进行跳转,所以是针对整体而非某个照片,文字

1:创建跳转后的Activity

创建一个新的Activity作为跳转后的页面

public class ArticleDetailActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_article_detail);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});}
}

2:页面跳转思路

回想一下之前学过的页面跳转是怎么个事,好多地方都用到了。

提问:我们不是在ArticleMoreListActivity中进行跳转,而是在Adapter中进行页面跳转,Adapter又不是一个Activity,那怎么整?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决思路:我们把ArticleMoreListActivity作为this参数,在适配器实例化的时候传参进去就OK了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们在适配器类中提供构造方法进行参数接收,并创建成员变量,完成变量的初始化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

activity.startActivity(new Intent(activity,ArticleDetailActivity.class); 这一句代码是关键

itemView 并不是指整个 item 中所包含的所有控件,而是指当前列表项(item)的根视图。可以理解成最外层视图容器,这个根视图容器内部包含了该 item 的所有子控件

public class MyViewHolder extends RecyclerView.ViewHolder {private final ImageView ivPicture;private final TextView tvTitle;private final TextView tvAuthor;public MyViewHolder(@NonNull View itemView) {super(itemView);ivPicture = itemView.findViewById(R.id.iv_picture);tvTitle = itemView.findViewById(R.id.tv_title);tvAuthor = itemView.findViewById(R.id.tv_author);itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                    int layoutPosition = getLayoutPosition();
//                    Article article = articles.get(layoutPosition);activity.startActivity(new Intent(activity,ArticleDetailActivity.class));}});}}

3:接口回调思想——页面回调

提出问题:把activity往适配中传是一件不优雅的事情,一般我们不会再适配器中处理具体的业务逻辑,跳转页面啥的

解决关键:想办法把这个点击事件告诉外面的activity

直观一点也就是把左图的点击事件想办法告诉ArticleMoreListActivity

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:优雅写法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:交互事件分析

  • 单个多个图片,点击页面跳转,长按,出现弹窗,不感兴趣,
  • 点击广告页面跳转

2:适配器中的工作

(1)定义接口

public interface ArticleItemCallBack{/*** 点击一张图片* @param position* @param article*/void onSimpleItemClick(int position , Article article);/*** 对两张图片的item做长按操作* @param position* @param article*/void OnLongClickItem2Click(int position , Article article);/*** 点击广告* @param position* @param article*/void onAdClick(int position , Article article);}

(2)设计构造方法和定义成员变量

private ArticleItemCallBack articleItemCallBack;

也可以单独选择去创建一个方法调用

	public ArticleMoreAdapter(ArticleItemCallBack articleItemCallBack) {this.articleItemCallBack = articleItemCallBack;}

(3)Holder中事件监听设置

public MyViewHolder(@NonNull View itemView) {super(itemView);/*** 对单张图片的item进行事件监听*/itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int layoutPosition = getLayoutPosition();Article article = articles.get(layoutPosition);articleItemCallBack.onSimpleItemClick(layoutPosition,article);}});}

效果:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

public MyViewHolder2(@NonNull View itemView) {super(itemView);/*** 对两张图片的item进行点击监听*/itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int layoutPosition = getLayoutPosition();Article article = articles.get(layoutPosition);articleItemCallBack.OnLongClickItem2Click(layoutPosition,article);}});}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

public AdViewHolder(@NonNull View itemView) {super(itemView);           /*** 对整个item容器进行监听*/itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int layoutPosition = getLayoutPosition();Article article = articles.get(layoutPosition);articleItemCallBack.onAdClick(layoutPosition,article);}});}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:Activity中的工作

(1)直接new CallBack 写法1

定义点击事件,看最上方的调用图就清楚流程了,这里的接口回调思想掌握住精髓了,真的感觉很奇妙

		ArticleMoreAdapter adapter = new ArticleMoreAdapter(new ArticleMoreAdapter.ArticleItemCallBack() {@Overridepublic void onSimpleItemClick(int position, Article article) {Toast.makeText(ArticleMoreListActivity.this,"跳转到单张图片对应的新闻资讯",Toast.LENGTH_SHORT).show();startActivity(new Intent(ArticleMoreListActivity.this, ArticleDetailActivity.class));}@Overridepublic void OnLongClickItem2Click(int position, Article article) {Toast.makeText(ArticleMoreListActivity.this,"你长按了2张图片对应的布局",Toast.LENGTH_SHORT).show();}@Overridepublic void onAdClick(int position, Article article) {Toast.makeText(ArticleMoreListActivity.this,"准备前往广告详细页面",Toast.LENGTH_SHORT).show();}});

(2)this写法

等价写法,会显得代码更清爽;

类实现接口,类中重写方法,传参this即可666

public class ArticleMoreListActivity extends AppCompatActivity implements ArticleMoreAdapter.ArticleItemCallBack 
//设置适配器ArticleMoreAdapter adapter = new ArticleMoreAdapter(this);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    @Overridepublic void onSimpleItemClick(int position, Article article) {Toast.makeText(ArticleMoreListActivity.this,"跳转到单张图片对应的新闻资讯",Toast.LENGTH_SHORT).show();startActivity(new Intent(ArticleMoreListActivity.this, ArticleDetailActivity.class));}@Overridepublic void OnLongClickItem2Click(int position, Article article) {Toast.makeText(ArticleMoreListActivity.this,"你长按了2张图片对应的布局",Toast.LENGTH_SHORT).show();}@Overridepublic void onAdClick(int position, Article article) {Toast.makeText(ArticleMoreListActivity.this,"准备前往广告详细页面",Toast.LENGTH_SHORT).show();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93392.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93392.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93392.shtml

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

相关文章

MySQL的分析查询语句(EXPLAIN):

目录 基本语法: 各个字段的含义: id: select_type: table: partitions: type: possible_keys: key: key_len: ref: row: …

C++ #if

在 C 中,#if 是 预处理器指令(Preprocessor Directive),用于 条件编译,即在编译阶段根据条件决定是否包含某段代码。它通常与 #define、#ifdef、#ifndef、#else 和 #endif 配合使用。基本语法#if 条件表达式// 如果条件…

方案 | 动车底部零部件检测实时流水线检测算法改进

项目背景随着我国高速铁路运营里程突破4.5万公里,动车组日均开行超过8000列次,传统人工巡检方式已无法满足密集运行下的安全检测需求。车底关键部件如制动系统、悬挂装置、牵引电机等长期承受高强度振动和冲击,易产生疲劳裂纹、螺栓松动、部件…

企业收款统计:驱动业务决策的核心引擎设计开发——仙盟创梦IDE

代码完整代码<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>黑金风格职员统计</title><style>/* 页面基础样式 - 黑金风格 */body {font-family: Segoe UI, Tahoma, Geneva, Verdana, …

CIAIE 2025上海汽车内外饰展观察:从美学到功能的产业跃迁

在智能化、电动化浪潮推动下&#xff0c;汽车产业的市场格局、技术路线、供应链结构与用户体验正被系统性重塑。汽车感知空间核心的“内外饰件”&#xff0c;正从原本的结构性、功能性部件&#xff0c;逐步跃升为智能化、情感化和差异化体验的重要承载载体&#xff0c;开启了从…

Spring IOC容器在Web环境中的启动奥秘:深入源码解析

一、为何需要关注IOC容器启动&#xff1f;在Java Web开发中&#xff0c;Spring MVC框架的基石正是IOC容器。但你是否思考过&#xff1a;独立的IOC模块如何与Tomcat等Servlet容器协同工作&#xff1f; 其启动过程与Web容器的生命周期深度绑定&#xff0c;这是构建稳定Spring应用…

前端JS处理时间,适用于聊天、操作记录等(包含刚刚、x分钟前、x小时前、x天前)

export default {// 首页时间转化formatDate(val) {var nowDate new Date()var oldDate new Date(val)const Y oldDate.getFullYear()const M oldDate.getMonth() 1const D oldDate.getDate()var diff nowDate.getTime() - oldDate.getTime()var minutes Math.floor(di…

C#---StopWatch类

老方法&#xff0c;想要全面了解和学习一个类必先看文档 微软文档 1.StopWatch 提供一组方法和属性&#xff0c;可用来测量运行时间。 1.1 属性和方法 属性&#xff1a; 方法&#xff1a; 1.2 使用 using System.Diagnostics;namespace Study04_反射专题 {internal cla…

3DTiles转OSGB格式逆向转换方法研究

一、概述 在倾斜摄影的应用领域中&#xff0c;3DTiles与OSGB格式的互转是常见的技术需求。作为专业的GIS处理平台&#xff0c;GISBox凭借其先进的倾斜摄影反切功能&#xff0c;为用户提供了高效、稳定的跨格式数据转换解决方案。 二、3DTiles转OSGB的意义 保留原始几何与纹理…

【门诊进销存出入库管理系统】佳易王医疗器械零售进销存软件:门诊进销存怎么操作?系统实操教程 #医药系统进销存

前言&#xff1a; &#xff08;一&#xff09;试用版获取方式 资源下载路径&#xff1a;进入博主头像主页第一篇文章末尾&#xff0c;点击卡片按钮&#xff1b;或访问左上角博客主页&#xff0c;通过右侧按钮获取详细资料。 说明&#xff1a;下载文件为压缩包&#xff0c;使用…

华为交换机配置文件的相关命令和用法

文章目录一、基本配置命令一、基本配置命令 1、查看当前运行的配置文件 <Huawei>display current-configuration2、配置文件保存 <Huawei>save <Huawei>save vrpcfg-20250623.zip #保存为指定文件名3、查看保存的配置 <Huawei>display saved-configu…

【汽车标定数据】动态优先级线程池在异步多文件解析中的应用

目录 一、需求背景 项目背景&#xff1a;电控数据管理系统优化 优化方案&#xff1a;引入OLAP数据库和动态线程池 线程池性能急需解决的问题 资源过载与闲置的平衡&#xff1a; 优先级处理与公平性&#xff1a; 任务类型适配性&#xff1a; 二、线程池介绍 2.1、线程池…

Unity人形角色IK优化指南

目录 Unity中人形角色的IKI 站立、奔跑IK 1. 接触面法线 2. 调整质心位置 3. 保持原本朝向 攀爬IK 1. 四肢贴合 2. 保持身体与攀爬面的距离 3. 适应外拐角 瞄准IK 1. 头部朝向 2. 手臂朝向 尾声 本文将尝试仅使用Untiy内置的Animator来解决常见的几种运动所需的IK…

基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用

1、前言 随着MCU的发展和需求的增多&#xff0c;USB已成为主流MCU的标配外设&#xff0c;但很多还是全速或低速IP&#xff0c;因此往往用不上高速抓包设备。 2、安装wireshark和拷贝抓包插件 将抓包插件拷贝到wireshark的extcap目录里&#xff0c;可参考基于wireshark的USB …

easyexcel模板导出Map数据时空值列被下一行列非空数据覆盖

场景是&#xff1a;我用模板导出数据&#xff0c;sheet数据是一个List<String,Object>集合&#xff0c;然后发现第一行的第三列应该为空&#xff0c;但是不为空&#xff0c;填上了第二行的第三列数据&#xff1b;就像按列写数据&#xff0c;碰到空值&#xff0c;下一行数…

并行Builder-输出型流程编排的新思路

如果对于框架的介绍不感兴趣的可以直接跳到Getting Started快速开始 在设计一款数据加载编排框架时&#xff0c;除了任何框架都必须具备的可靠性与稳定性之外&#xff0c;对于本次编排框架的设计&#xff0c;我们把核心目标放在高性能与易用性上。这不仅要求框架能够快速、高效…

C#WPF实战出真汁03--登录界面设计

1、登录界面设计要点简洁直观的布局 登录界面应避免复杂元素&#xff0c;突出核心功能。通常包含用户名/邮箱输入框、密码输入框、登录按钮及可选功能&#xff08;如“记住我”“忘记密码”&#xff09;。保持表单字段不超过5个&#xff0c;减少用户认知负担。清晰的视觉层次 通…

前端css学习笔记6:盒子模型

本文为个人学习总结&#xff0c;如有谬误欢迎指正。前端知识众多&#xff0c;后续将继续记录其他知识点&#xff01; 目录 前言 一、组成 ​编辑content padding border margin margin塌陷 margin合并 使用场景 标题与段落间距 卡片列表布局 二、内容溢出—overflo…

以下是对智能电梯控制系统功能及系统云端平台设计要点的详细分析,结合用户提供的梯控系统网络架构设计和系统软硬件组成,分点论述并补充关键要点:

智能电梯控制系统功能及系统云端平台设计要点一、梯控系统网络架构设计服务本地化&#xff1a;电梯门禁服务器本地化部署&#xff1a;核心服务器部署在项目本地&#xff0c;确保数据安全、运维及时性&#xff0c;减少网络依赖。需支持本地独立运行&#xff0c;避免云端故障影响…

全球电商业财一体化:让出海品牌实现“看得见的增长“

内外贸并行的数字化挑战在数字经济浪潮下&#xff0c;中国品牌呈现"双轮驱动"增长态势&#xff1a;一边深耕天猫、京东、抖音等国内主流平台&#xff0c;一边通过Amazon、Tiktok、eBay、Temu等渠道拓展全球市场。然而&#xff0c;多平台、多币种、多地区的复杂运营环…