Android使用RecyclerView實(shí)現(xiàn)自定義列表、點(diǎn)擊事件以及下拉刷新
Android使用RecyclerView
1. 什么是RecyclerView
RecyclerView 是 Android-support-v7-21 版本中新增的一個(gè) Widgets,官方對(duì)于它的介紹則是:RecyclerView 是 ListView 的升級(jí)版本,更加先進(jìn)和靈活。
簡單來說就是:RecyclerView是一種新的視圖組,目標(biāo)是為任何基于適配器的視圖提供相似的渲染方式。它被作為ListView和GridView控件的繼承者,在最新的support-V7版本中提供支持。
2. 使用RecyclerView需要掌握什么
Adapter — 包裝數(shù)據(jù)集合并且為每個(gè)條目創(chuàng)建視圖
LayoutManager — 將每個(gè)條目的視圖放置于適當(dāng)?shù)奈恢?br />
OnItemClickListener — 給每個(gè)條目設(shè)置點(diǎn)擊事件
SwipeRefreshLayout — 給RecyclerView添加下拉刷新事件
ItemAnimator — 在每個(gè)條目的視圖的周圍或上面繪制一些裝飾視圖
ItemDecoration — 在條目被添加、移除或者重排序時(shí)添加動(dòng)畫效果
3. 使用RecyclerView前需要準(zhǔn)備什么
添加依賴包(以Android Studio為例)
4. 自定義Adapter
RecyclerView.Adapter包含了一種新型適配器,其實(shí)與以前我們使用的適配器基本類似,只是稍微有所不同,比如viewholder它幫我們封裝好了,不用像以前使用listview的適配器一樣自己去寫viewholder了。
Item視圖如下:
實(shí)例代碼如下:
public class RecyclerAdapter extends RecyclerView.Adapter { private List<Model> models; public RecyclerAdapter(List<Model> models){ this.models = models; } class ViewHolder extends RecyclerView.ViewHolder{ private ImageView picture; private TextView title,text; public ViewHolder(View itemView) { super(itemView); picture = (ImageView) itemView.findViewById(R.id.picture); title = (TextView) itemView.findViewById(R.id.title); text = (TextView) itemView.findViewById(R.id.text); } public ImageView getPicture(){ return picture; } public TextView getTitle(){ return title; } public TextView getText(){ return text; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { final ViewHolder vh = (ViewHolder) holder; vh.getPicture().setImageResource(models.get(position).getPicture()); vh.getTitle().setText(models.get(position).getTitle()); vh.getText().setText(models.get(position).getText()); } @Override public int getItemCount() { return models.size(); } }
5. LayoutManager有什么作用
由于RecyclerView已經(jīng)不單單像以前ListView或者GridView一樣,它被作為ListView和GridView控件的繼承者,所以在使用它的時(shí)候需要通過設(shè)置它的LayoutManager去規(guī)定它是哪一種類型,另外也可通過設(shè)置LayoutManager去設(shè)置它是橫向還是縱向的列表,以及是否反轉(zhuǎn)。
縱向列表:(第三個(gè)參數(shù)是設(shè)置是否反轉(zhuǎn),即滑動(dòng)方向)
mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerview.setLayoutManager(mLayoutManager);
橫向列表:
mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);
垂直表格布局:
mLayoutManager = new GridLayoutManager(this,2);
recyclerview.setLayoutManager(mLayoutManager);
水平表格布局:(第四個(gè)參數(shù)代表是否反轉(zhuǎn))
mLayoutManager = new GridLayoutManager(this,2,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);
6. 為什么要自己添加OnItemClickListener
RecyclerView有一個(gè)缺點(diǎn),在RecyclerView中,沒有一個(gè)onItemClickListener方法。所以目前在適配器中處理這樣的事件比較好。如果想要從適配器上添加或移除條目,需要明確通知適配器。這與先前的notifyDataSetChanged()方法稍微有些不同。具體操作在適配器代碼中就可以體現(xiàn)。
具體代碼如下:
public class RecyclerAdapter extends RecyclerView.Adapter { private List<Model> models; public RecyclerAdapter(List<Model> models){ this.models = models; } class ViewHolder extends RecyclerView.ViewHolder{ private ImageView picture; private TextView title,text; public ViewHolder(View itemView) { super(itemView); picture = (ImageView) itemView.findViewById(R.id.picture); title = (TextView) itemView.findViewById(R.id.title); text = (TextView) itemView.findViewById(R.id.text); } public ImageView getPicture(){ return picture; } public TextView getTitle(){ return title; } public TextView getText(){ return text; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { final ViewHolder vh = (ViewHolder) holder; vh.getPicture().setImageResource(models.get(position).getPicture()); vh.getTitle().setText(models.get(position).getTitle()); vh.getText().setText(models.get(position).getText()); //如果設(shè)置了回調(diào),就設(shè)置點(diǎn)擊事件 if (mOnItemClickListener != null){ vh.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(vh.itemView,position); } }); } } @Override public int getItemCount() { return models.size(); } /** * ItemClick的回調(diào)接口 */ public interface OnItemClickListener{ void onItemClick(View view,int position); } private OnItemClickListener mOnItemClickListener; public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener){ this.mOnItemClickListener = mOnItemClickListener; } }
7. 實(shí)現(xiàn)下拉刷新與上拉加載更多
其實(shí)跟以前一樣,原生的ListView或者GridView都不能滿足實(shí)際App的需要,很多時(shí)候都要通過自定義View去實(shí)現(xiàn)列表的下拉刷新和上拉加載,RecyclerView也是一樣,不過這里不會(huì)介紹如何去自定義RecyclerView,相反,我們會(huì)借用SwipeRefreshLayout這個(gè)組件,更快地去實(shí)現(xiàn)列表刷新功能
界面布局如下:
<view android:id="@+id/swipeRefreshLayout" class="android.support.v4.widget.SwipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </view>
設(shè)置下拉刷新監(jiān)聽事件:
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //重新獲取數(shù)據(jù) //獲取完成swipeRefreshLayout.setRefreshing(false); } });
設(shè)置上拉加載更多可以通過設(shè)置滑動(dòng)監(jiān)聽事件來實(shí)現(xiàn):
recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { swipeRefreshLayout.setRefreshing(true); //分頁獲取數(shù)據(jù) //獲取完成swipeRefreshLayout.setRefreshing(false); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } });
8. ItemAnimator 與ItemDecorator
由于RecyclerView里沒有自帶分割線,所以就出現(xiàn)了ItemDecorator,但其實(shí)還有另外一種方法,就是直接在Item界面布局中添加分割線,這樣可以省去很多代碼;
而ItemAnimator簡單來說是會(huì)根據(jù)適配器上收到的相關(guān)通知去動(dòng)畫的顯示組件的修改,添加和刪除等。它會(huì)自動(dòng)添加和移除item的動(dòng)畫。自帶的默認(rèn)效果也不錯(cuò),已經(jīng)非常好了。因?yàn)檫@兩項(xiàng)不是很常用,所以這里就不多加介紹了,有興趣的同學(xué)可以上網(wǎng)找詳細(xì)的資料學(xué)習(xí)。
相關(guān)文章
android實(shí)現(xiàn)快遞跟蹤進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)快遞跟蹤進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android仿QQ空間動(dòng)態(tài)界面分享功能
這篇文章主要介紹了Android仿QQ空間動(dòng)態(tài)界面分享功能,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-04-04Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果(附demo源碼下載)
這篇文章主要介紹了Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果,涉及Android的布局與控件設(shè)置技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-04-04Android實(shí)現(xiàn)倒計(jì)時(shí)CountDownTimer使用詳解
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)倒計(jì)時(shí)CountDownTimer的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android中Fragment子類及其PreferenceFragment的創(chuàng)建過程演示
這篇文章主要介紹了Android中Fragment子類及其PreferenceFragment的創(chuàng)建過程演示,PreferenceFragment用來保存Fragment的選項(xiàng)設(shè)置,需要的朋友可以參考下2016-05-05android實(shí)現(xiàn)倒計(jì)時(shí)功能(開始、暫停、0秒結(jié)束)
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)倒計(jì)時(shí)功能,開始、暫停、0秒結(jié)束,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android Material Design 陰影實(shí)現(xiàn)示例
這篇文章主要介紹了Android Material Design 陰影實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Flutter學(xué)習(xí)LogUtil封裝與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Flutter學(xué)習(xí)LogUtil封裝與實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09