使用RecyclerView實現(xiàn)Item點擊事件
概述
RecyclerView本身沒有實現(xiàn)點擊事件,需要自定義接口進行實現(xiàn)
接口定義
onRecyclerViewItemClickListener
接口名稱隨自己喜歡起,放置的位置也隨你喜歡,因為是 public 放哪都能調(diào)用到
方法參數(shù)上這里考慮可能會對布局進行調(diào)整,傳入了父控件和當前item以及索引位置
public interface onRecyclerViewItemClickListener{
void onItemClick(RecyclerView parent, View view, int position);
void onItemLongClick(RecyclerView parent, View view, int position);
}如果想要一個接口管理一個監(jiān)聽事件回調(diào),也可以單獨弄一個定義接口文件,更規(guī)范些
事件參數(shù)也可以根據(jù)需要進行調(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);
}
}以上如果看不明白,那接口這個概念就需要再翻看一下了
Adapter
接下來就要改造這個Adapter了
初始化接口事件
//初使化自定義的接口,接口定義在哪個包下就會把哪個包名也引入進來,只是名字長點,不影響使用
private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
//為了方便接口函數(shù)傳值,這里把RecyclerView控件拉出來,如果接口方法參數(shù)列表里沒有,可以不用寫
private RecyclerView rvParent;綁定接口回調(diào)事件
//定義一個公用方法,可以在Activity中來綁定接口事件
public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}綁定控件監(jiān)聽
這里有兩種實現(xiàn)方式
直接給控件綁定監(jiān)聽事件
代碼中的寫法可以不作參考,具體看你想要給某個控件進行綁定監(jiān)聽還是給整個item綁定監(jiān)聽,和正??丶壎]啥判別
只是具體的事件內(nèi)容改為調(diào)用監(jiān)聽接口事件的方法即可
別忘了把參數(shù)傳進去給外部調(diào)用時使用
@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
另一個就是在你的類名之后 implements 一個 View.OnClickListener 然后重寫 onClick 方法
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener {此時會報錯提示要重載 onClick事件
使用這種方法,在此獲取不到當前的索引位置,
可以定義一個 int 公用變量來存儲更新,
也可以如上面把 RecyclerView 拉出來,通過當前view來查找索引位置
具體看自己喜好,這里只作一個演示
//重載點擊事件,指定點擊事件時執(zhí)行自定義的onItemClick
@Override
public void onClick(View view) {
//此時就用到上面拉出來的那個 rvParent 了
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null)
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}只是設定監(jiān)聽事件了,但沒有指定監(jiān)聽事件給誰,那點擊之后是不會有反應的,還需要在 onCreateViewHolder 中綁定監(jiān)聽事件
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一個父控件,把 RecyclerView 拉出來供 onClick 事件使用
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false);
//綁定監(jiān)聽點擊事件,因為類本身 implement 了 View.OnClickListener 此時只要監(jiān)聽綁定到 this 就可以了
view.setOnClickListener(this);
return new myViewHolder(view, mContext);
}完整代碼
下面給出了完整的代碼,中間無關的信息省略了
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) {
//指定一個父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false);
//綁定監(jiān)聽點擊事件
view.setOnClickListener(this);
return new myViewHolder(view, mContext);
}
...
//重載點擊事件,指定點擊事件時執(zhí)行自定義的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null)
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
...
//實例化自定義接口
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ào)用當前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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Android動態(tài)給ViewPager添加Indicator導航
這篇文章主要為大家詳細介紹了Android動態(tài)給ViewPager添加Indicator導航的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android使用Pull解析器解析xml文件的實現(xiàn)代碼
Android使用Pull解析器解析xml文件的實現(xiàn)代碼,需要的朋友可以參考一下2013-02-02
Android中使用WebSocket實現(xiàn)群聊和消息推送功能(不使用WebView)
WebSocket protocol 是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務器全雙工通信(full-duplex)。本文給大家介紹Android中使用WebSocket實現(xiàn)群聊和消息推送功能(不使用WebView),需要的朋友參考下2016-02-02

