宣告:原創作品,轉載請註明出處:www.jianshu.com/p/4d658b0b7…
今天來說一說,我們如何給自己的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的使用方式。
系列文章
《RecyclerView使用指南(一)—— 基本使用》
《RecyclerView使用指南(二)—— 多種ItemLayout》
《RecyclerView使用指南(三)—— 新增分割線和點選事件》
《RecyclerView使用指南(四)—— 使用ItemDecoration》
《RecyclerView使用指南(五)—— 實現吸頂效果》