RecyclerView控件学习2

在上篇中讲到了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)实现参数传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值