Android XRecyclerView最簡單的item點擊事件處理
以前一直都是用PullToRefresh,后來覺得還是太out了?,F(xiàn)在很多人都是用RecyclerView,很簡單的用法,布局多樣化,主要是有瀑布流。這才知道RecyclerView.LayoutManager真正的強大。
但是說要addHeaderView這個的話,RecyclerView沒有實現(xiàn),所以我用了XRecyclerView,其實它也是在RecyclerView的基礎(chǔ)上再次封裝的,用起來還是蠻好的。
這里說一下,正確的使用XRecyclerView點擊item做事件處理的問題。其實就是在RecyclerView.ViewHolder里面的item做點擊,那么設(shè)計到一個問題就是如何簡單使用了。
一般我們會直接在item布局中的最外層設(shè)置一個id=”@+id/…”,然后在onBindViewHolder中用holder.**.setOnClickListener()進行事件處理,你看看你是不是這樣做的,如果這樣做的話,那就繼續(xù)往下看,教你簡單的。
簡單使用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的構(gòu)造方法中也用到了super(view)。
其實這里的view就是item的布局,這樣的話,我們要實現(xiàn)點擊事件就很容易了,可以直接在用holder.itemView.setOnClickListener
item的點擊錯位問題
用XRecyclerView.getChildAt(position).setOnClickListener()出現(xiàn)錯位問題,如果你在addHeaderView就會出現(xiàn)這種錯位的問題會更加明顯,可以先來看看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時他都會進行notifyDataSetChanged,而且在onCreateViewHolder也有了對應(yīng)的isHeaderType判斷,所以當(dāng)你想選擇第一個item做事件處理時可能就pos=0是屬于headerview。
總結(jié)
item點擊事件簡單方便快捷的方式:holder.itemView.setOnClickListener()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android RecyclerView實現(xiàn)點擊條目刪除
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView實現(xiàn)點擊條目刪除,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
Android ViewPager實現(xiàn)Banner循環(huán)播放
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實現(xiàn)Banner循環(huán)播放,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Kotlin基礎(chǔ)學(xué)習(xí)之lambda中return語句詳解
這篇文章主要給大家介紹了關(guān)于Kotlin基礎(chǔ)學(xué)習(xí)之lambda中return語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用Kotlin具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Android定時器Timer的停止和重啟實現(xiàn)代碼
本篇文章主要介紹了Android實現(xiàn)定時器Timer的停止和重啟實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Android Studio 3.6 正式版終于發(fā)布了,快來圍觀
Android Studio 3.6 正式版終于發(fā)布了,值得興奮呀,畢竟 3.5 大版本更新也已經(jīng)差不多半年了,撒花撒花!這次更新又更新了什么呢?快來跟隨小編一起看看吧2020-02-02

