Android XRecyclerView最簡(jiǎn)單的item點(diǎn)擊事件處理
以前一直都是用PullToRefresh,后來(lái)覺(jué)得還是太out了。現(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源碼是怎么寫的
/**
* 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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 三種延遲操作的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 延遲操作的實(shí)現(xiàn)方法的相關(guān)資料,這里提供了三種實(shí)現(xiàn)方法,希望能幫助到大家,需要的朋友可以參考下2017-08-08
Android基于Mapbox?V10?繪制LineGradient軌跡
這篇文章主要介紹了Android基于Mapbox?V10?繪制LineGradient軌跡,文章通告介紹一些V10上的用法,最終講下如何繪制漸變運(yùn)動(dòng)記錄軌跡,感興趣的小伙伴可以參考一下2022-08-08
Android實(shí)現(xiàn)雙擊TitleBar回頂部的功能示例代碼
一個(gè)簡(jiǎn)單易用的導(dǎo)航欄TitleBar,可以輕松實(shí)現(xiàn)IOS導(dǎo)航欄的各種效果,下面這篇文章主要給大家介紹了關(guān)于Android如何實(shí)現(xiàn)雙擊TitleBar回頂部功能的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09
Android編程開發(fā)之EditText中inputType屬性小結(jié)
這篇文章主要介紹了Android編程開發(fā)之EditText中inputType屬性用法,分析說(shuō)明了Android中EditText的inputType屬性具體含義與使用技巧,需要的朋友可以參考下2016-01-01
Android 如何實(shí)現(xiàn)亮度自動(dòng)調(diào)節(jié)
這篇文章主要介紹了Android 如何實(shí)現(xiàn)亮度自動(dòng)調(diào)節(jié),幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-04-04
Android 滑動(dòng)小圓點(diǎn)ViewPager的兩種設(shè)置方法詳解流程
Viewpager,視圖翻頁(yè)工具,提供了多頁(yè)面切換的效果。Android 3.0后引入的一個(gè)UI控件,位于v4包中。低版本使用需要導(dǎo)入v4包,現(xiàn)在我們一般不再兼容3.0及以下版本,另外使用Android studio開發(fā),默認(rèn)導(dǎo)入v7包,v7包含了v4,所以不用導(dǎo)包,越來(lái)越方便了2021-11-11
Android 自動(dòng)補(bǔ)全提示輸入AutoCompleteTextView、 MultiAutoCompleteTextV
本文主要介紹了Android自動(dòng)補(bǔ)全提示輸入AutoCompleteTextView、 MultiAutoCompleteTextView,具有一定的參考作用,下面跟著小編一起來(lái)看下吧2017-01-01
Android自定義控件實(shí)現(xiàn)水波紋效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)水波紋效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
LayoutAnimation給ListView中的item設(shè)置動(dòng)態(tài)出場(chǎng)效果(實(shí)例)
下面小編就為大家?guī)?lái)一篇LayoutAnimation給ListView中的item設(shè)置動(dòng)態(tài)出場(chǎng)效果(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Android開發(fā)MQTT協(xié)議的模型及通信淺析
這篇文章主要W為大家介紹了Android開發(fā)MQTT協(xié)議的模型及通信淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

