Android RecyclerView 基礎(chǔ)知識(shí)詳解
本周的谷歌I/O大會(huì)帶來了很多關(guān)于Android的振奮人心的消息。可能我們需要較長的時(shí)間來消化Android L引入的新東西。
這些天我一直在研究RecyclerView,并想在此給各位分享一下到目前為止我的成果。
RecyclerView是什么?
RecyclerView是一種新的視圖組,目標(biāo)是為任何基于適配器的視圖提供相似的渲染方式。它被作為ListView和GridView控件的繼承者,在最新的support-V7版本中提供支持。
在開發(fā)RecyclerView時(shí)充分考慮了擴(kuò)展性,因此用它可以創(chuàng)建想到的任何種類的的布局。但在使用上也稍微有些不便。這就是Android——要完成一件事情總不是那么容易。
如果使用RecyclerView,你需要了解以下三個(gè)元素:
- RecyclerView.Adapter
- LayoutManager
- ItemAnimator
RecyclerView.Adapter
RecyclerView包含了一種新型適配器。它與現(xiàn)在使用的適配器類似,但也稍有不同,例如它需要使用ViewHolder。使用時(shí)需要重寫兩個(gè)主要方法:一個(gè)用來展現(xiàn)視圖和它的持有者,而另一個(gè)用來把數(shù)據(jù)綁定到視圖上。這么做的好處是,第一種方法只有當(dāng)我們真正需要?jiǎng)?chuàng)建一個(gè)新視圖時(shí)才被調(diào)用,不需要檢查它是否已經(jīng)被回收。
; html-script: false ]
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
private List<ViewModel> items;
private int itemLayout;
public MyRecyclerAdapter(List<ViewModel> items, int itemLayout) {
this.items = items;
this.itemLayout = itemLayout;
}
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
return new ViewHolder(v);
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
ViewModel item = items.get(position);
holder.text.setText(item.getText());
holder.image.setImageBitmap(null);
Picasso.with(holder.image.getContext()).cancelRequest(holder.image);
Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);
holder.itemView.setTag(item);
}
@Override public int getItemCount() {
return items.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public TextView text;
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.image);
text = (TextView) itemView.findViewById(R.id.text);
}
}
}
這是一個(gè)簡單的適配器,但是事情逐漸開始變得有點(diǎn)復(fù)雜。在RecyclerView中,沒有一個(gè)onItemClickListener方法(至少我沒有發(fā)現(xiàn))。所以適配器是一個(gè)處理事件的良好的候選人。
如果想要從適配器上添加或移除條目,需要明確通知適配器。這與先前的notifyDataSetChanged()方法稍微有些不同。
; html-script: false ]
public void add(ViewModel item, int position) {
items.add(position, item);
notifyItemInserted(position);
}
public void remove(ViewModel item) {
int position = items.indexOf(item);
items.remove(position);
notifyItemRemoved(position);
}
LayoutManager
這個(gè)類決定視圖被放在畫面中哪個(gè)位置,但這只是它的眾多職責(zé)之一。它可以管理滾動(dòng)和循環(huán)利用。
LayoutManager只有一個(gè)叫做LinearLayoutManager的實(shí)現(xiàn)類,它有1500多行代碼。但從這一點(diǎn)就可以看出它有多復(fù)雜。管理器可以模擬列表視圖(包括橫向和縱向),但沒有頁眉和頁尾。
為LayoutManager編寫子類不太適合新手,我們需要依靠社區(qū)來發(fā)掘RecyclerView的全部潛力。與這個(gè)例子一起,在短時(shí)間內(nèi)我會(huì)上傳一個(gè)GridView控件的實(shí)現(xiàn)。
我認(rèn)為這背后的關(guān)鍵是要仿照LinearLayoutManager的代碼創(chuàng)建一個(gè)BaseLayoutManager,并且基于此進(jìn)行擴(kuò)展?;蛟Ssupport-v7的最終版本會(huì)提供更多、更好的實(shí)現(xiàn)。
ItemAnimator
ItemAnimator會(huì)根據(jù)適配器上收到的通知?jiǎng)赢嬶@示視圖組的修改?;旧希鼤?huì)自動(dòng)顯示添加和移除條目動(dòng)畫。這也不是一個(gè)簡單的類,但我們發(fā)現(xiàn)DefaultItemAnimator已經(jīng)可以運(yùn)行得很好了。
RecyclerView設(shè)置
所以最后,如果想要初始化一個(gè)運(yùn)行的RecyclerView,你需要做這樣的事情:
; html-script: false ] RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(new MyRecyclerAdapter(createMockList(), R.layout.item)); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setItemAnimator(new DefaultItemAnimator());
setHasFixedSize()方法用來使RecyclerView保持固定的大小,該信息被用于自身的優(yōu)化。
總結(jié)
RecyclerView確實(shí)是一個(gè)強(qiáng)大的視圖,它為開發(fā)者提供了無限的擴(kuò)展能力。學(xué)習(xí)曲線可能會(huì)非常陡峭。但我相信,不久Android社區(qū)就會(huì)發(fā)布LayoutManager超棒的實(shí)現(xiàn)。
我在創(chuàng)建一個(gè)github倉庫,在那里可以找到這個(gè)例子。它是我計(jì)劃創(chuàng)建的一個(gè)擴(kuò)展庫的基礎(chǔ)。你可以測試GridView的實(shí)現(xiàn)。歡迎各種形式的反饋。

以上就是對(duì)Android RecyclerView 的基礎(chǔ)資料的詳解,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
相關(guān)文章
fragment實(shí)現(xiàn)隱藏及界面切換效果
這篇文章主要為大家詳細(xì)介紹了fragment實(shí)現(xiàn)隱藏及界面切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
微信小程序電商常用倒計(jì)時(shí)實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了微信小程序電商常用倒計(jì)時(shí)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
AndroidStudio利用android-support-multidex解決64k的各種異常
這篇文章主要為大家詳細(xì)介紹了AndroidStudio利用android-support-multidex解決64k的各種異常,感興趣的小伙伴們可以參考一下2016-09-09
詳解Android Studio實(shí)現(xiàn)用戶登陸界面demo(xml實(shí)現(xiàn))
這篇文章主要介紹了詳解Android Studio實(shí)現(xiàn)用戶登陸界面demo,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Flutter Image實(shí)現(xiàn)圖片加載
這篇文章主要為大家詳細(xì)介紹了Flutter Image實(shí)現(xiàn)圖片加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
使用Retrofit下載文件并實(shí)現(xiàn)進(jìn)度監(jiān)聽的示例
這篇文章主要介紹了使用Retrofit下載文件并實(shí)現(xiàn)進(jìn)度監(jiān)聽的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Android ListView彈性效果的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android ListView彈性效果的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-05-05

