您好,登錄后才能下訂單哦!
以前一直都是用PullToRefresh,后來(lái)覺(jué)得還是太out了?,F(xiàn)在很多人都是用RecyclerView,很簡(jiǎn)單的用法,布局多樣化,主要是有瀑布流。這才知道RecyclerView.LayoutManager真正的強(qiáng)大。
但是說(shuō)要addHeaderView這個(gè)的話,RecyclerView沒(méi)有實(shí)現(xiàn),所以我用了XRecyclerView,其實(shí)它也是在RecyclerView的基礎(chǔ)上再次封裝的,用起來(lái)還是蠻好的。
這里說(shuō)一下,正確的使用XRecyclerView點(diǎn)擊item做事件處理的問(wèn)題。其實(shí)就是在RecyclerView.ViewHolder里面的item做點(diǎn)擊,那么設(shè)計(jì)到一個(gè)問(wèn)題就是如何簡(jiǎn)單使用了。
一般我們會(huì)直接在item布局中的最外層設(shè)置一個(gè)id=”@+id/…”,然后在onBindViewHolder中用holder.**.setOnClickListener()進(jìn)行事件處理,你看看你是不是這樣做的,如果這樣做的話,那就繼續(xù)往下看,教你簡(jiǎn)單的。
簡(jiǎn)單使用item的點(diǎn)擊事件
1、先看下RecyclerView.ViewHolder源碼是怎么寫(xiě)的
/** * 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、再來(lái)看看我們繼承它做了什么事情
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的構(gòu)造方法中也用到了super(view)。
其實(shí)這里的view就是item的布局,這樣的話,我們要實(shí)現(xiàn)點(diǎn)擊事件就很容易了,可以直接在用holder.itemView.setOnClickListener
item的點(diǎn)擊錯(cuò)位問(wèn)題
用XRecyclerView.getChildAt(position).setOnClickListener()出現(xiàn)錯(cuò)位問(wèn)題,如果你在addHeaderView就會(huì)出現(xiàn)這種錯(cuò)位的問(wèn)題會(huì)更加明顯,可以先來(lái)看看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); } }
當(dāng)我們每次addHeaderView時(shí)他都會(huì)進(jìn)行notifyDataSetChanged,而且在onCreateViewHolder也有了對(duì)應(yīng)的isHeaderType判斷,所以當(dāng)你想選擇第一個(gè)item做事件處理時(shí)可能就pos=0是屬于headerview。
總結(jié)
item點(diǎn)擊事件簡(jiǎn)單方便快捷的方式:holder.itemView.setOnClickListener()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。