RecyclerView使用指南(三)—— 新增分割線和點選事件
宣告:原創作品,轉載請註明出處:ofollow,noindex">https://www.jianshu.com/p/4d658b0b7d40
今天來說一說,我們如何給自己的RecyclerView新增分割線和點選事件,講完這兩個功能點,已經可以滿足日常開發工作了。
一、分割線:
這個功能非常簡單,因為SDK已經為我們實現了這個功能,我們只需要呼叫RecyclerView的addItemDecoration()方法,並傳入DividerItemDecoration的物件就OK了。程式碼如下:
RecyclerView recyclerView = findViewById(R.id.rv); RvAdapter adapter = new RvAdapter(list); recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); recyclerView.setAdapter(adapter);
這樣,我們就為我們的RecyclerView添加了分割線。

二、點選事件
RecyclerView本身沒有提供點選事件給我們,所以我們需要自己實現這個功能。
- 基本思路:
- 建立OnItemClickListener介面。
- 修改Adapter,增加OnItemClickListener型別的成員變數和set方法。
- 在onBindViewHolder()方法中,根據OnItemClickListener,為條目設定監聽。
- 在Activity中設定點選監聽。
好,有了思路,我們開始一步一步的執行:
建立介面OnItemClickListener:
package com.liuym.myapplication; import android.view.View; public interface OnItemClickListener { void onItemClick(View view, int positon); }
修改Adapter:
package com.liuym.myapplication; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.List; public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //條目型別 public static final int TYPE_0 = 0; public static final int TYPE_1 = 1; //資料來源 private List<Data> mList; //點選監聽 private OnItemClickListener mOnItemClickListener; public RvAdapter(List<Data> list) { mList = list; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { View item; RecyclerView.ViewHolder holder = null; if (viewType == TYPE_0) { item = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_rv_type1, viewGroup, false); holder = new Type0ViewHolder(item); } if (viewType == TYPE_1) { item = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_rv_type2, viewGroup, false); holder = new Type1ViewHolder(item); } return holder; } /** * 根據資料來源的某一項,返回相應的佈局類別 * * @param position * @return */ @Override public int getItemViewType(int position) { return mList.get(position).getType(); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) { int type = getItemViewType(i); Data data = mList.get(i); if (type == TYPE_0) { Type0ViewHolder holder = (Type0ViewHolder) viewHolder; holder.iv.setImageResource(R.drawable.ic_launcher_background); holder.tv.setText(data.getText()); if (mOnItemClickListener != null) { holder.ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(v,i); } }); } } if (type == TYPE_1) { Type1ViewHolder holder = (Type1ViewHolder) viewHolder; holder.iv.setImageResource(R.drawable.ic_launcher_background); holder.tv.setText(data.getText()); if (mOnItemClickListener != null) { holder.ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(v,i); } }); } } } @Override public int getItemCount() { return mList == null ? 0 : mList.size(); } class Type0ViewHolder extends RecyclerView.ViewHolder { LinearLayout ll; ImageView iv; TextView tv; public Type0ViewHolder(@NonNull View itemView) { super(itemView); ll = itemView.findViewById(R.id.ll); iv = itemView.findViewById(R.id.iv); tv = itemView.findViewById(R.id.tv); } } class Type1ViewHolder extends RecyclerView.ViewHolder { LinearLayout ll; ImageView iv; TextView tv; public Type1ViewHolder(@NonNull View itemView) { super(itemView); ll = itemView.findViewById(R.id.ll); iv = itemView.findViewById(R.id.iv); tv = itemView.findViewById(R.id.tv); } } }
在Activity中為Adapter設定條目點選事件:
adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(View view, int positon) { Toast.makeText(MainActivity.this, list.get(positon).getText(), Toast.LENGTH_SHORT).show(); } });
總結
這一篇,我講解了如何新增分割線和Item的點選事件,下一篇我會詳細的講解一下ItemDecoration的使用方式。