在上篇中讲到了RecyclerView的基本用法,由于RecyclerView没有涉及点击事件,手动实现以下这个效果。
回想起以前给ListView的一个item的某个子控件涉及点击效果(比如点赞),我们是通过在自定义的Adapter的getView的方法完成的。那么给item添加点击事件也可以在RecyclerView.Adapter中尝试一下。
上一篇文章中已经说到BaseAdapter的getView方法是和RecyclerView.Adapter是每个条目的View。也就是说ViewHolder里面包含了需要加载的view。看看RecyclerView的 source code,ViewHolder的构造方法。
public static abstract class ViewHolder {
public ViewHolder(View itemView) {
if (itemView == null) {
throw new IllegalArgumentException("itemView may not be null");
}
this.itemView = itemView;
}
}
可以把点击事件作为这个成员View的setOnItemClickListener事件来写。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
public interface OnItemClickListener
{
void onItemClick(View view,int position);
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
mOnItemClickListener=onItemClickListener ;
}
private LayoutInflater mInflater;
private List<Integer> mDatas;
public MyAdapter (Context context, List<Integer> datats)
{
mInflater = LayoutInflater.from(context);
mDatas = datats;
}
public static class ViewHolder extends RecyclerView.ViewHolder
{
public ViewHolder(View arg0)
{
super(arg0);
}
ImageView mImg;
TextView mTxt;
}
@Override
public int getItemCount()
{
return mDatas.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View view = mInflater.inflate(R.layout.activity_index_gallery_item,
viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.mImg = (ImageView) view
.findViewById(R.id.id_index_gallery_item_image);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i)
{
viewHolder.mImg.setImageResource(mDatas.get(i));
if(mOnItemClickListener!=null){
viewHolder.itemView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mOnItemClickLitener.onItemClick(viewHolder.itemView, i);
}
});
}
}
}
最后在在主Activity设置adapter的点击事件即可。
接下来根据这个例子我们来写一个相册图片点击切换的例子。我们举一反三,自定义RecyclerView控件,对拖动事件做个监听。首先回顾一下View体系中各个方法的触发调用关系,onMeasure,onLayout
这是别人的实验结果
1.onMeasure方法会在view的位置信息发生变化或调用。
2.子view回调了onMeasure方法,父view一定也会回调onMeasure方法。
3.onMeasure方法回调后,一定会回调onLayout方法。
当RecyclerView滑动时,给他的onLayout和onTouchEvent添加一个设置,
具体的思路就是继承一个RecyclerView,定义一个滚动的回调接口。参数是view和下标。通过RecyclerView的getChildAt(i)和getChildPosition(view)实现参数传递。