Android入門教程 | RecyclerView響應子項點選
點選,是最常見最重要的的互動手段。 下面介紹 RecyclerView 設定點選的方法。這裡給出比較常見的實現方式,即監聽者模式。
使用者點選某個 item 時,app可以做出相應的反應。這裡我們使用新增點選監聽器的方式來實現這個效果。
在Android開發中,監聽器模式使用十分廣泛。 相信大家對
setOnClickListener
方法非常熟悉。最先被初學者認識到的應該是 Button 的點選事件監聽。
設計並新增監聽器
首先設計監聽器。新建
OnItemClickListener1
介面。
在實際開發中,介面的名字可以定義的更有含義一些。
public interface OnItemClickListener { void onItemClick(Character c); void onItemLongClick(Character c); }
這個介面裡我們放置了2個方法。分別用來響應點選與長按事件。
Adapter持有監聽器
首先修改一下VH類。我們希望整個item來接受點選。
private class VH extends RecyclerView.ViewHolder { View item; // 我們希望拿到整個item的view TextView tv1; TextView tv2; public VH(@NonNull View itemView) { super(itemView); item = itemView; tv1 = itemView.findViewById(R.id.tv1); tv2 = itemView.findViewById(R.id.tv2); } }
接下來修改前面的 Adapter 類。在介面卡中持有監聽器物件
onItemClickListener
。 在
onBindViewHolder
方法中,給 item 設定監聽。
holder.item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick(c); } } }); holder.item.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemLongClick(c); } return true; } });
這裡加上判空處理。防止空指標。 實際上,是item這個 View 接收到了點選事件,再透過我們設計的監聽器把事件傳出去。
setOnLongClickListener
這裡返回 true。把這個long click事件消費掉。
此時的
LetterAdapter
完整程式碼如下。
private class LetterAdapter extends RecyclerView.Adapter<VH> { private List<Character> dataList; private OnItemClickListener onItemClickListener; public LetterAdapter(List<Character> dataList) { this.dataList = dataList; // 這裡最好進行判空處理 } @NonNull @Override public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_letter, parent, false)); } @Override public void onBindViewHolder(@NonNull VH holder, int position) { final Character c = dataList.get(position); holder.tv1.setText(c.toString()); holder.tv2.setText(String.valueOf(Integer.valueOf(c))); holder.item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick(c); } } }); holder.item.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemLongClick(c); } return true; } }); } @Override public int getItemCount() { return dataList.size(); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } }
使用監聽器
經過上面的努力,我們的 LetterAdapter 有了監聽器的功能。現在在 activity 中為列表設定監聽。
mLetterAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(Character c) { Toast.makeText(getApplicationContext(), "Click " + c, Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(Character c) { Toast.makeText(getApplicationContext(), "Long click " + c, Toast.LENGTH_LONG).show(); } });
這裡可以看出,設定監聽器的是 LetterAdapter ,而不是 RecyclerView 。
執行起來,點選列表看看效果。
設計監聽器的另一個方案
上面我們透過介面(
interface
)來給設計了點選監聽器。 我們可以試試不用介面,改用抽象類(
abstract class
)來設計監聽器。
新建抽象類
AbsOnItemClick.java
。
public abstract class AbsOnItemClick { public abstract void onClick(char c); public void onLongClick(char c) { } }
裡面1個抽象方法,1個普通 public 方法。
依葫蘆畫瓢,在
LetterAdapter
類中新增這個監聽器。
private AbsOnItemClick absOnItemClick; // onBindViewHolder方法中設定監聽 holder.item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (absOnItemClick != null) { absOnItemClick.onClick(c); } } }); holder.item.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (absOnItemClick != null) { absOnItemClick.onLongClick(c); } return true; } }); // setter方法 設定監聽器 public void setAbsOnItemClick(AbsOnItemClick absOnItemClick) { this.absOnItemClick = absOnItemClick; }
在activity中設定監聽器。
mLetterAdapter.setAbsOnItemClick(new AbsOnItemClick() { @Override public void onClick(char c) { Log.d("rustApp", "[abs] onClick: " + c); } });
執行起來看看效果。可以看到打出了log。
rustApp: [abs] onClick: h
抽象類與介面
對比介面我們可體會到,抽象類有自己獨特的地方。抽象類強制我們實現了它的抽象方法。而普通的方法是由我們自己選擇是否重寫。 在實際開發中,我們可以根據需要選擇是用介面還是抽象類。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70008155/viewspace-2841420/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android入門教程 | RecyclerView使用入門AndroidView
- Android入門教程 | RecyclerView實際使用AndroidView
- [Android]關於Android子view超出父view無法響應點選事件AndroidView事件
- appium+python+android,如何驗證 RecyclerView 子項數量?APPPythonAndroidView
- Android之點選兩次才響應onclick方法Android
- Android入門教程 | Kotlin協程入門AndroidKotlin
- 【Android開發入門教程】二.Android應用程式結構分析Android
- Web Components 入門例項教程Web
- Android入門教程 | 使用 ConstraintLayout 構建自適應介面AndroidAI
- 【應急響應】Windows應急響應入門手冊Windows
- 【Android開發入門教程】三.Activity入門指南!Android
- Android入門教程 | SharedPreferences 簡介Android
- Android入門教程 | DialogFragment 的使用AndroidFragment
- android原生開發recyclerview基礎例項AndroidView
- SpringMVC 入門、請求、響應SpringMVC
- jQuery 關於點選選單項,使子條目jQuery
- RecyclerView點選新增波紋效果View
- ActiveMQ入門系列二:入門程式碼例項(點對點模式)MQ模式
- Android入門教程 | AsyncTask 使用介紹Android
- Android入門教程 | 多執行緒Android執行緒
- Android入門教程 | DrawerLayout 側滑欄Android
- Android入門教程 | Fragment 基礎概念AndroidFragment
- Android入門教程 | EditText 使用者輸入Android
- RecyclerView-->點選和長按事件View事件
- Android入門教程 | Fragment (載入方法與通訊)AndroidFragment
- Android入門教程:ConstraintLayout約束佈局AndroidAI
- Android OkHttp原始碼解析入門教程(一)AndroidHTTP原始碼
- Android OkHttp原始碼解析入門教程(二)AndroidHTTP原始碼
- Android入門教程 | Button,TextView背景設定AndroidTextView
- Android入門教程 | 廣播機制 BroadcastAndroidAST
- 快應用快速入門教程
- 響應式程式設計入門(RxJava)程式設計RxJava
- gitbook 入門教程之匯出電子書Git
- gitbook 入門教程之釋出電子書Git
- 《MySQL 入門教程》第 19 篇 子查詢MySql
- Android Studio 從入門到精通視訊教程Android
- 快應用學習教程-入門
- Android中的RecyclerViewAndroidView