RecyclerView很强大,很暴力,但是没有一系列的点击事件,如下图是RecycleView结构中的所有set开头的方法:
其中有个setRecyclerListener貌似可能是,但它其实是重复利用布局时的监听器,跟点击类事件没关系。
到了这里,也就是说我们想要的点击、长按等事件需要我们自定义了。
这个自定义我们认为写在Adapter中是比较恰当的。
逻辑:在自定义Adapter中添加回调接口,通过一个public方法公开接口的设置。接口定义的事件由ItemView触发。
之所以选择item的最外层布局,是因为只有这个布局能保证最大范围的接受到事件。当了,这里既然可以这样写,如果需求是点击item中某个特定空间触发事件,那么该触发控件就可以换成是需求的控件了。
好了,直接上代码:
/**
* Created by Shareye on 2016/5/31.
*/
public class SimpleStringAdapter extends RecyclerView.Adapter {
private List<String> strList;
private OnItemClickListener itemClickListener;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.lst_item_simple_string,parent,false);
return new StringHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
StringHolder stringHolder = (StringHolder) holder;
//为整体布局设置点击事件,触发接口的回调
stringHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(itemClickListener!=null)
itemClickListener.onItemClick(strList.get(position), position);
}
});
}
@Override
public int getItemCount() {
return null==strList?0:strList.size();
}
public void setStrList(List<String> strList) {
this.strList = strList;
notifyDataSetChanged();
}
static class StringHolder extends RecyclerView.ViewHolder{
@Bind(R.id.ll_layout)
View itemView;//给item最外层一个id以获取控件
public StringHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);//初始化ButterKnife
}
}
//点击事件接口
public interface OnItemClickListener{
void onItemClick(String str, int position);
}
//设置点击事件的方法
public void setItemClickListener(OnItemClickListener itemClickListener){
this.itemClickListener = itemClickListener;
}
}
R.layout.lst_item_simple_string布局文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ll_layout">
<!-- 任意需要控件 -->
</LinearLayout>