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源码是怎么写的
/** *AViewHolderdescribesanitemviewandmetadataaboutitsplacewithintheRecyclerView. * *{@linkAdapter}implementationsshouldsubclassViewHolderandaddfieldsforcaching *potentiallyexpensive{@linkView#findViewById(int)}results.
* *While{@linkLayoutParams}belongtothe{@linkLayoutManager}, *{@linkViewHolderViewHolders}belongtotheadapter.Adaptersshouldfeelfreetouse *theirowncustomViewHolderimplementationstostoredatathatmakesbindingviewcontents *easier.Implementationsshouldassumethatindividualitemviewswillholdstrongreferences *to
*/ publicstaticabstractclassViewHolder{ publicfinalViewitemView; ....... publicViewHolder(ViewitemView){ if(itemView==null){ thrownewIllegalArgumentException("itemViewmaynotbenull"); } this.itemView=itemView; } ....... }ViewHolder
objectsandthatRecyclerView
instancesmayhold *strongreferencestoextraoff-screenitemviewsforcachingpurposes
2、再来看看我们继承它做了什么事情
publicclassXRViewHolderextendsRecyclerView.ViewHolder{ publicXRViewHolder(Viewview){ super(view); ButterKnife.bind(this,view); } ....... publicvoidonBindViewHolder(VHholder,finalintposition){ if(position>=0){ holder.itemView.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ itemClick(getItem(position),position); } }); } } }
看到我们自定义的XRViewHolder的构造方法中也用到了super(view)。
其实这里的view就是item的布局,这样的话,我们要实现点击事件就很容易了,可以直接在用holder.itemView.setOnClickListener
item的点击错位问题
用XRecyclerView.getChildAt(position).setOnClickListener()出现错位问题,如果你在addHeaderView就会出现这种错位的问题会更加明显,可以先来看看XRecyclerView里面的部分源码。
publicclassXRecyclerViewextendsRecyclerView{ privateWrapAdaptermWrapAdapter; ...... publicvoidaddHeaderView(Viewview){ sHeaderTypes.add(HEADER_INIT_INDEX+mHeaderViews.size()); mHeaderViews.add(view); if(mWrapAdapter!=null){ mWrapAdapter.notifyDataSetChanged(); } } ...... privateclassWrapAdapterextendsRecyclerView.Adapter{ @Override publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent,intviewType){ if(viewType==TYPE_REFRESH_HEADER){ returnnewSimpleViewHolder(mRefreshHeader); }elseif(isHeaderType(viewType)){ returnnewSimpleViewHolder(getHeaderViewByType(viewType)); }elseif(viewType==TYPE_FOOTER){ returnnewSimpleViewHolder(mFootView); } returnadapter.onCreateViewHolder(parent,viewType); } }
当我们每次addHeaderView时他都会进行notifyDataSetChanged,而且在onCreateViewHolder也有了对应的isHeaderType判断,所以当你想选择第一个item做事件处理时可能就pos=0是属于headerview。
总结
item点击事件简单方便快捷的方式:holder.itemView.setOnClickListener()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。