使用RecyclerView實(shí)現(xiàn)Item點(diǎn)擊事件
概述
RecyclerView本身沒有實(shí)現(xiàn)點(diǎn)擊事件,需要自定義接口進(jìn)行實(shí)現(xiàn)
接口定義
onRecyclerViewItemClickListener
接口名稱隨自己喜歡起,放置的位置也隨你喜歡,因?yàn)槭?public 放哪都能調(diào)用到
方法參數(shù)上這里考慮可能會(huì)對布局進(jìn)行調(diào)整,傳入了父控件和當(dāng)前item以及索引位置
public interface onRecyclerViewItemClickListener{ void onItemClick(RecyclerView parent, View view, int position); void onItemLongClick(RecyclerView parent, View view, int position); }
如果想要一個(gè)接口管理一個(gè)監(jiān)聽事件回調(diào),也可以單獨(dú)弄一個(gè)定義接口文件,更規(guī)范些
事件參數(shù)也可以根據(jù)需要進(jìn)行調(diào)整,如果沒有特別需要,只要拿到item索引位置即可
public interface IAdapter { /* * Item 單擊事件后續(xù)處理 */ interface OnRVItemClickListener { void onClick(int position); } /* * Item 長按事件后續(xù)處理 */ interface OnRVItemLongClickListener { boolean onLongClick(int position); } /* * Item 移除事件后續(xù)處理 */ interface OnRVItemRemoveListener{ void onRemove(int position); } }
以上如果看不明白,那接口這個(gè)概念就需要再翻看一下了
Adapter
接下來就要改造這個(gè)Adapter了
初始化接口事件
//初使化自定義的接口,接口定義在哪個(gè)包下就會(huì)把哪個(gè)包名也引入進(jìn)來,只是名字長點(diǎn),不影響使用 private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; //為了方便接口函數(shù)傳值,這里把RecyclerView控件拉出來,如果接口方法參數(shù)列表里沒有,可以不用寫 private RecyclerView rvParent;
綁定接口回調(diào)事件
//定義一個(gè)公用方法,可以在Activity中來綁定接口事件 public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; }
綁定控件監(jiān)聽
這里有兩種實(shí)現(xiàn)方式
直接給控件綁定監(jiān)聽事件
代碼中的寫法可以不作參考,具體看你想要給某個(gè)控件進(jìn)行綁定監(jiān)聽還是給整個(gè)item綁定監(jiān)聽,和正??丶壎]啥判別
只是具體的事件內(nèi)容改為調(diào)用監(jiān)聽接口事件的方法即可
別忘了把參數(shù)傳進(jìn)去給外部調(diào)用時(shí)使用
@Override public void onBindViewHolder(@NonNull viewHolder holder, int position) { holder.bind(lstCharges.get(position)); holder.mView.getRoot().setOnClickListener(view -> itemClickListener.onClick(position)); holder.mView.getRoot().setOnLongClickListener(view -> itemLongClickListener.onLongClick(position)); }
比較推薦這種寫法,至于為什么:簡單!
繼承 View.OnClickListener
另一個(gè)就是在你的類名之后 implements 一個(gè) View.OnClickListener 然后重寫 onClick 方法
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener {
此時(shí)會(huì)報(bào)錯(cuò)提示要重載 onClick事件
使用這種方法,在此獲取不到當(dāng)前的索引位置,
可以定義一個(gè) int 公用變量來存儲(chǔ)更新,
也可以如上面把 RecyclerView 拉出來,通過當(dāng)前view來查找索引位置
具體看自己喜好,這里只作一個(gè)演示
//重載點(diǎn)擊事件,指定點(diǎn)擊事件時(shí)執(zhí)行自定義的onItemClick @Override public void onClick(View view) { //此時(shí)就用到上面拉出來的那個(gè) rvParent 了 int position = rvParent.getChildAdapterPosition(view); if (onRecyclerViewItemClickListener != null) onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); }
只是設(shè)定監(jiān)聽事件了,但沒有指定監(jiān)聽事件給誰,那點(diǎn)擊之后是不會(huì)有反應(yīng)的,還需要在 onCreateViewHolder 中綁定監(jiān)聽事件
@NonNull @Override public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //指定一個(gè)父控件,把 RecyclerView 拉出來供 onClick 事件使用 rvParent = (RecyclerView) parent; View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false); //綁定監(jiān)聽點(diǎn)擊事件,因?yàn)轭惐旧?implement 了 View.OnClickListener 此時(shí)只要監(jiān)聽綁定到 this 就可以了 view.setOnClickListener(this); return new myViewHolder(view, mContext); }
完整代碼
下面給出了完整的代碼,中間無關(guān)的信息省略了
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener { ... private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; private RecyclerView rvParent; ... @NonNull @Override public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //指定一個(gè)父控件 rvParent = (RecyclerView) parent; View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false); //綁定監(jiān)聽點(diǎn)擊事件 view.setOnClickListener(this); return new myViewHolder(view, mContext); } ... //重載點(diǎn)擊事件,指定點(diǎn)擊事件時(shí)執(zhí)行自定義的onItemClick @Override public void onClick(View view) { int position = rvParent.getChildAdapterPosition(view); if (onRecyclerViewItemClickListener != null) onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); } ... //實(shí)例化自定義接口 public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; } }
Activity
接下來和正常ListView綁定監(jiān)聽事件的操作差不多
fileAdapter.setOnItemClickListener(new pub.onRecyclerViewItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position) { //自定義點(diǎn)擊后的功能事件 ... /* 此處代碼僅供參考,演示怎樣調(diào)用當(dāng)前item的信息 mView.tvFmPath.setText(lstFiles.get(position).getFilePath()); getPath(lstFiles.get(position).getFilePath()); fileAdapter.notifyDataSetChanged(); */ } @Override public void onItemLongClick(RecyclerView parent, View view, int position) { //自定義長按后的功能事件 ... } });
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android動(dòng)態(tài)給ViewPager添加Indicator導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android動(dòng)態(tài)給ViewPager添加Indicator導(dǎo)航的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android入門教程之Vibrator(振動(dòng)器)
本節(jié)我們介紹的是Vibrator(振動(dòng)器),是手機(jī)自帶的振動(dòng)器,其實(shí)就是Android給我們提供的用于機(jī)身震動(dòng)的一個(gè)服務(wù)!當(dāng)收到推送消息的時(shí)候我們可以設(shè)置震動(dòng)提醒。2016-07-07Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼
Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-02-02Android中使用WebSocket實(shí)現(xiàn)群聊和消息推送功能(不使用WebView)
WebSocket protocol 是HTML5一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。本文給大家介紹Android中使用WebSocket實(shí)現(xiàn)群聊和消息推送功能(不使用WebView),需要的朋友參考下2016-02-02Android ListView列表實(shí)現(xiàn)倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了Android ListView列表實(shí)現(xiàn)倒計(jì)時(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android實(shí)現(xiàn)多線程下載圖片的方法
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)多線程下載圖片的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09從0快速搭建一個(gè)實(shí)用的MVVM框架(超詳細(xì))
這篇文章主要介紹了從0搭建一個(gè)實(shí)用的MVVM框架,結(jié)合Jetpack,構(gòu)建快速開發(fā)的MVVM框架,支持快速生成ListActivity、ListFragment,主要是基于MVVM進(jìn)行快速開發(fā)上手即用,需要的朋友可以參考下2022-03-03