声明:原创作品,转载请注明出处: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的使用方式。
系列文章
《RecyclerView使用指南(一)—— 基本使用》
《RecyclerView使用指南(二)—— 多种ItemLayout》
《RecyclerView使用指南(三)—— 添加分割线和点击事件》
《RecyclerView使用指南(四)—— 使用ItemDecoration》
《RecyclerView使用指南(五)—— 实现吸顶效果》