虽然recyclerview为 整个recyclerview设置了一些监听事件,但是没有自带为其中的item设置点击事件
本文将提供一种recyclerview中item的点击监听事件的实现方法
先看看效果图:
第一,你需要一个接口:
public interface OnItemClickListener {
void OnItemclick(View view,int position);
}
第二,再适配器中 声明一个该接口的引用
public class Adapter extends RecyclerView.Adapter<ViewHolderr> {
private LayoutInflater layoutInflater;
private Context context;
private String[] datas;
private OnItemClickListener onItemClickListener;//声明一个接口的引用
public Adapter(Context context, String[] datas) {//构造函数传入Context对象和数据源
this.layoutInflater=LayoutInflater.from(context);
this.context = context;
this.datas = datas;
}
@Override
public ViewHolderr onCreateViewHolder(ViewGroup parent, int viewType) {
View view=layoutInflater.inflate(R.layout.item,parent,false);
ViewHolderr viewHolderr=new ViewHolderr(view);
return viewHolderr;
}
@Override
public void onBindViewHolder(final ViewHolderr holder, int position) {
holder.getButton().setText(datas[position]);
//在该函数中为recyclerview的视图绑定监听事件
if (onItemClickListener != null) {
holder.getButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.OnItemclick(holder.itemView, holder.getLayoutPosition());
}
});
}
}
@Override
public int getItemCount() {
return datas.length;
}
public void setOnItemClickListner(OnItemClickListener onItemClickListner){
this.onItemClickListener=onItemClickListner;
}
}
第三,就是在Mainactivity中给recyclerview设置监听事件了:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
final LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerview.setLayoutManager(linearLayoutManager);
Adapter adapterr=new Adapter(this,datas);
adapterr.setOnItemClickListner(new OnItemClickListener() {
@Override
public void OnItemclick(View view, int position) {
Toast.makeText(MainActivity.this, datas[position], Toast.LENGTH_SHORT).show();
}
});
recyclerview.setAdapter(adapterr);
recyclerview.setHasFixedSize(true);
recyclerview.setItemAnimator(new DefaultItemAnimator());
}
以下是对整个recycler的监听事件(来自https://developer.android.com/)
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
//返回当前recyclerview的可见的item数目,也就是datas.length
//dx是水平滚动的距离,dy是垂直滚动距离,向上滚动的时候为正,向下滚动的时候为负
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisibleItemPosition=linearLayoutManager.findFirstVisibleItemPosition();//可见范围内的第一项的位置
int lastVisibleItemPosition=linearLayoutManager.findLastVisibleItemPosition();//可见范围内的最后一项的位置
int itemCount=linearLayoutManager.getItemCount();//recyclerview中的item的所有的数目
//System.out.println(linearLayoutManager.getItemCount());
System.err.println(dy);
}
});
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
/*
new State
0(SCROLL_STATE_IDLE)表示recyclerview是不动的(The RecyclerView is not currently scrolling.)
1(SCROLL_STATE_DRAGGING)表示recyclerview正在被拖拽(The RecyclerView is currently being dragged by outside input such as user touch input.)
2(SCROLL_STATE_SETTLING)表示recyclerview正在惯性下滚动(The RecyclerView is currently animating to a final position while not under outside control.)
*/
switch(newState)
{
case 0:
System.out.println("recyclerview已经停止滚动");
break;
case 1:
System.out.println("recyclerview正在被拖拽");
break;
case 2:
System.out.println("recyclerview正在依靠惯性滚动");
break;
}
}
});
Demo源码已经上传到github.com,需要的朋友请戳https://github.com/Gpwner/Recyclerview/tree/master