Android之RecyclerView简单使用(二)

新滴一年开始啦,给亲们拜个晚年,短暂滴假期过去了,我想说:“假期还没开始,就结束了”。废话不多说,继续我们上一篇的内容。
在上一篇博客中,有小伙伴提议道:要使用RecyclerView必须要把依赖包和v7包同时导入才能使用,上篇博客忘了说v7包的导入,其实v7包和那个依赖包添加方式一样,输入:v7进行搜索,结果如图:
这里写图片描述
这样就把V7包添加到项目里面了。上篇博客中有个地方写的不规范,这里纠正一下啦:
这里写图片描述
那个findViewById写到这里面,不要在onCreateViewHolder方法里面写了(虽说那样写也不错,但不提倡)。
上次说过RecyclerView点击事件和长按事件需要自己写。这次我们来学习写点击事件和长按事件。这次我使用的回调,在RecyclerViewAdapter里面,代码如下:


//回调
public interface OnItemClickListener {
        //点击事件
        void OnItemClick(int position);
        //长按事件
        boolean OnItemLongClick(int position);
}
private OnItemClickListener mOnItemClickListener;
//设置回调   
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
        this.mOnItemClickListener = mOnItemClickListener;
}

这样回调写好了,下面我们需要在onBindViewHolder里面处理,代码如下:

//设置点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                if(mOnItemClickListener != null) {
                //Returns the position of the ViewHolder in terms of the
                //latest layout pass.
                int pos = holder.getLayoutPosition();
                mOnItemClickListener.OnItemClick(pos);
                }
        }
});
//设置长按事件
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
                if (mOnItemClickListener != null) {
                        int pos = holder.getLayoutPosition();
                        return mOnItemClickListener.OnItemLongClick(pos);
                }
                return false;
        }
});

其中getLayoutPosition()是获取ViewHolder通过的最新位置,源码如下:

/**
* Returns the position of the ViewHolder in terms of the latest *layout pass.
* <p>
* This position is mostly used by RecyclerView components to be *consistent while RecyclerView lazily processes adapter updates.
* <p>
* For performance and animation reasons, RecyclerView batches all  *adapter updates until the next layout pass. This may cause *mismatches between the Adapter position of the item and the position *it had in the latest layout calculations.
* <p>
*LayoutManagers should always call this method while doing *calculations based on item positions. All methods in 
* {@link RecyclerView.LayoutManager},{@link RecyclerView.State},         *{@link RecyclerView.Recycler} that receive a position expect it to *be the layout position of the item.
* <p>
* If LayoutManager needs to call an external method that requires the *adapter position of the item, it can use 
* {@link #getAdapterPosition()} or{@linkRecyclerView
* .Recycler#convertPreLayoutPositionToPostLayout(int)}.
* 
* @return Returns the adapter position of the ViewHolder in the *latest layout pass.
* @see #getAdapterPosition()
*/
public final int getLayoutPosition() {
        return mPreLayoutPosition == NO_POSITION ? mPosition : mPreLayoutPosition;
}

这样我们只需要在RecyclerActivity里面给adapter设置事件即可:

adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
        @Override
        public void OnItemClick(int position) {
                Toast.makeText(RecyclerActivity.this, "你点击了第" + position + "个图片", 
                        Toast.LENGTH_SHORT).show();
        }

        @Override
        public boolean OnItemLongClick(int position) {
                Toast.makeText(RecyclerActivity.this, "你长按了第" + position + "个图片",   
                        Toast.LENGTH_SHORT).show();
                return true;
        //return false;
        }
});

这样子就实现RecyclerView点击事件和长按事件。关于长按事件return值,如果为ture,则不允许其他处理,表示消费掉了长按事件,如果为false,则允许其他处理事件,表示没有消费掉长按事件。但是呢,点击有个时间限制,如果超过了这个时间,就会取消点击事件。是不是感觉晕晕滴呀,看一下图,就明白了。
当为true时:
这里写图片描述
当为false时,不超时:
这里写图片描述
当为false时,超时:
这里写图片描述
看了图是不是理解了呢?这次就说这么多,有不对的地方记得给我留言~~
喜欢我滴,顶一下呗~~
关于eclpise需要导入v7包:v7下载地址链接

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值