【Android】適配器與外部事件的交互

在這里插入圖片描述

三三要成為安卓糕手
引入:在上一篇文章中我們完成了新聞展示頁面多布局案例的展示,感悟頗多,本篇文章,繼續去開發一些新的功能

一:關閉廣告

所有的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;多平臺、多幣種、多地區的復雜運營環…