Android XRecyclerView最简单的item点击事件处理
Posted BandaYung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android XRecyclerView最简单的item点击事件处理相关的知识,希望对你有一定的参考价值。
以前一直都是用PullToRefresh,后来觉得还是太out了。现在很多人都是用RecyclerView,很简单的用法,布局多样化,主要是有瀑布流。这才知道RecyclerView.LayoutManager真正的强大。
但是说要addHeaderView这个的话,RecyclerView没有实现,所以我用了XRecyclerView,其实它也是在RecyclerView的基础上再次封装的,用起来还是蛮好的。一个字爽。。。
这里说一下,正确的使用XRecyclerView点击item做事件处理的问题。其实就是在RecyclerView.ViewHolder里面的item做点击,那么设计到一个问题就是如何简单使用了。
一般我们会直接在item布局中的最外层设置一个id=”@+id/…”,然后在onBindViewHolder中用holder.**.setOnClickListener()进行事件处理,你看看你是不是这样做的,如果这样做的话,那就继续往下看,教你简单的。
简单使用item的点击事件
1、先看下RecyclerView.ViewHolder源码是怎么写的
/**
* A ViewHolder describes an item view and metadata about its place within the RecyclerView.
*
* <p>@link Adapter implementations should subclass ViewHolder and add fields for caching
* potentially expensive @link View#findViewById(int) results.</p>
*
* <p>While @link LayoutParams belong to the @link LayoutManager,
* @link ViewHolder ViewHolders belong to the adapter. Adapters should feel free to use
* their own custom ViewHolder implementations to store data that makes binding view contents
* easier. Implementations should assume that individual item views will hold strong references
* to <code>ViewHolder</code> objects and that <code>RecyclerView</code> instances may hold
* strong references to extra off-screen item views for caching purposes</p>
*/
public static abstract class ViewHolder
public final View itemView;
.......
public ViewHolder(View itemView)
if (itemView == null)
throw new IllegalArgumentException("itemView may not be null");
this.itemView = itemView;
.......
2、再来看看我们继承它做了什么事情
public class XRViewHolder extends RecyclerView.ViewHolder
public XRViewHolder(View view)
super(view);
ButterKnife.bind(this, view);
.......
public void onBindViewHolder(VH holder, final int position)
if (position >= 0)
holder.itemView.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
itemClick(getItem(position), position);
);
看到我们自定义的XRViewHolder的构造方法中也用到了super(view)。
其实这里的view就是item的布局,这样的话,我们要实现点击事件就很容易了,可以直接在用holder.itemView.setOnClickListener
item的点击错位问题
用XRecyclerView.getChildAt(position).setOnClickListener()出现错位问题,如果你在addHeaderView就会出现这种错位的问题会更加明显,可以先来看看XRecyclerView里面的部分源码。
public class XRecyclerView extends RecyclerView
private WrapAdapter mWrapAdapter;
......
public void addHeaderView(View view)
sHeaderTypes.add(HEADER_INIT_INDEX + mHeaderViews.size());
mHeaderViews.add(view);
if (mWrapAdapter != null)
mWrapAdapter.notifyDataSetChanged();
......
private class WrapAdapter extends RecyclerView.Adapter<ViewHolder>
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
if (viewType == TYPE_REFRESH_HEADER)
return new SimpleViewHolder(mRefreshHeader);
else if (isHeaderType(viewType))
return new SimpleViewHolder(getHeaderViewByType(viewType));
else if (viewType == TYPE_FOOTER)
return new SimpleViewHolder(mFootView);
return adapter.onCreateViewHolder(parent, viewType);
当我们每次addHeaderView时他都会进行notifyDataSetChanged,而且在onCreateViewHolder也有了对应的isHeaderType判断,所以当你想选择第一个item做事件处理时可能就pos=0是属于headerview。
总结
item点击事件简单方便快捷的方式:holder.itemView.setOnClickListener()
以上是关于Android XRecyclerView最简单的item点击事件处理的主要内容,如果未能解决你的问题,请参考以下文章
android 怎么在外面拿recyclerview 中viewholder的控件