Android RecyclerView 基礎知識詳解
本周的谷歌I/O大會帶來了很多關于Android的振奮人心的消息。可能我們需要較長的時間來消化Android L引入的新東西。
這些天我一直在研究RecyclerView,并想在此給各位分享一下到目前為止我的成果。
RecyclerView是什么?
RecyclerView是一種新的視圖組,目標是為任何基于適配器的視圖提供相似的渲染方式。它被作為ListView和GridView控件的繼承者,在最新的support-V7版本中提供支持。
在開發(fā)RecyclerView時充分考慮了擴展性,因此用它可以創(chuàng)建想到的任何種類的的布局。但在使用上也稍微有些不便。這就是Android——要完成一件事情總不是那么容易。
如果使用RecyclerView,你需要了解以下三個元素:
- RecyclerView.Adapter
- LayoutManager
- ItemAnimator
RecyclerView.Adapter
RecyclerView包含了一種新型適配器。它與現(xiàn)在使用的適配器類似,但也稍有不同,例如它需要使用ViewHolder。使用時需要重寫兩個主要方法:一個用來展現(xiàn)視圖和它的持有者,而另一個用來把數(shù)據(jù)綁定到視圖上。這么做的好處是,第一種方法只有當我們真正需要創(chuàng)建一個新視圖時才被調(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); } } }
這是一個簡單的適配器,但是事情逐漸開始變得有點復雜。在RecyclerView中,沒有一個onItemClickListener方法(至少我沒有發(fā)現(xiàn))。所以適配器是一個處理事件的良好的候選人。
如果想要從適配器上添加或移除條目,需要明確通知適配器。這與先前的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
這個類決定視圖被放在畫面中哪個位置,但這只是它的眾多職責之一。它可以管理滾動和循環(huán)利用。
LayoutManager只有一個叫做LinearLayoutManager的實現(xiàn)類,它有1500多行代碼。但從這一點就可以看出它有多復雜。管理器可以模擬列表視圖(包括橫向和縱向),但沒有頁眉和頁尾。
為LayoutManager編寫子類不太適合新手,我們需要依靠社區(qū)來發(fā)掘RecyclerView的全部潛力。與這個例子一起,在短時間內(nèi)我會上傳一個GridView控件的實現(xiàn)。
我認為這背后的關鍵是要仿照LinearLayoutManager的代碼創(chuàng)建一個BaseLayoutManager,并且基于此進行擴展。或許support-v7的最終版本會提供更多、更好的實現(xiàn)。
ItemAnimator
ItemAnimator會根據(jù)適配器上收到的通知動畫顯示視圖組的修改?;旧?,它會自動顯示添加和移除條目動畫。這也不是一個簡單的類,但我們發(fā)現(xiàn)DefaultItemAnimator已經(jīng)可以運行得很好了。
RecyclerView設置
所以最后,如果想要初始化一個運行的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)化。
總結
RecyclerView確實是一個強大的視圖,它為開發(fā)者提供了無限的擴展能力。學習曲線可能會非常陡峭。但我相信,不久Android社區(qū)就會發(fā)布LayoutManager超棒的實現(xiàn)。
我在創(chuàng)建一個github倉庫,在那里可以找到這個例子。它是我計劃創(chuàng)建的一個擴展庫的基礎。你可以測試GridView的實現(xiàn)。歡迎各種形式的反饋。
以上就是對Android RecyclerView 的基礎資料的詳解,后續(xù)繼續(xù)補充相關資料,謝謝大家對本站的支持!
相關文章
新版Android studio導入微信支付和支付寶官方Demo問題解決大全
這篇文章主要為大家詳細介紹了新版Android studio導入微信支付和支付寶官方Demo問題的解決大全,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07Android Data Binding數(shù)據(jù)綁定詳解
本文主要介紹Android Data Binding數(shù)據(jù)綁定的知識,這里整理了詳細的資料及簡單示例代碼幫助大家學習理解此部分知識,有需要的小伙伴可以參考下2016-09-09Android Studio finish()方法的使用與解決app點擊“返回”(直接退出)
這篇文章主要介紹了Android Studio finish()方法的使用與解決app點擊“返回”(直接退出),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Android開發(fā)-之環(huán)境的搭建(圖文詳解)
這篇文章主要介紹了Android開發(fā)-之環(huán)境的搭建(圖文詳解),具有一定的參考價值,有興趣的可以了解一下。2016-11-11Android添加(創(chuàng)建)、刪除及判斷是否存在桌面快捷方式的方法
這篇文章主要介紹了Android添加(創(chuàng)建)、刪除及判斷是否存在桌面快捷方式的方法,涉及Android針對桌面快捷方式的相關操作技巧,需要的朋友可以參考下2015-05-05Android中RecyclerView點擊Item設置事件
這篇文章主要介紹了Android中RecyclerView點擊Item設置事件的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07Android UI組件LinearLayout線性布局詳解
這篇文章主要為大家詳細介紹了AndroidUI組件LinearLayout線性布局,具有一定的實用性,感興趣的小伙伴們可以參考一下2016-08-08