#RecyclerView和ListView的異同
---
* ViewHolder是用來保存視圖引用的類,無論是ListView亦或是RecyclerView。只不過在ListView中,ViewHolder需要自己來定義,且這只是一種推薦的使用方式,不使用當然也可以,這不是必須的。只不過不使用ViewHolder的話,ListView每次getView的時候都會調用findViewById(int),這將導致ListView性能展示遲緩。而在RecyclerView中使用RecyclerView.ViewHolder則變成了必須,盡管實現起來稍顯復雜,但它卻解決了ListView面臨的上述不使用自定義ViewHolder時所面臨的問題。
* 我們知道ListView只能在垂直方向上滾動,Android API沒有提供ListView在水平方向上面滾動的支持。或許有多種方式實現水平滑動,但是請想念我,ListView并不是設計來做這件事情的。但是RecyclerView相較于ListView,在滾動上面的功能擴展了許多。它可以支持多種類型列表的展示要求,主要如下:
1. LinearLayoutManager,可以支持水平和豎直方向上滾動的列表。
2. StaggeredGridLayoutManager,可以支持交叉網格風格的列表,類似于瀑布流或者Pinterest。
3. GridLayoutManager,支持網格展示,可以水平或者豎直滾動,如展示圖片的畫廊。
* 列表動畫是一個全新的、擁有無限可能的維度。起初的Android API中,刪除或添加item時,item是無法產生動畫效果的。后面隨著Android的進化,Google的Chat Hasse推薦使用ViewPropertyAnimator屬性動畫來實現上述需求。
相比較于ListView,RecyclerView.ItemAnimator則被提供用于在RecyclerView添加、刪除或移動item時處理動畫效果。同時,如果你比較懶,不想自定義ItemAnimator,你還可以使用DefaultItemAnimator。
* ListView的Adapter中,getView是最重要的方法,它將視圖跟position綁定起來,是所有神奇的事情發生的地方。同時我們也能夠通過registerDataObserver在Adapter中注冊一個觀察者。RecyclerView也有這個特性,RecyclerView.AdapterDataObserver就是這個觀察者。ListView有三個Adapter的默認實現,分別是ArrayAdapter、CursorAdapter和SimpleCursorAdapter。然而,RecyclerView的Adapter則擁有除了內置的內DB游標和ArrayList的支持之外的所有功能。RecyclerView.Adapter的實現的,我們必須采取措施將數據提供給Adapter,正如BaseAdapter對ListView所做的那樣。
* 在ListView中如果我們想要在item之間添加間隔符,我們只需要在布局文件中對ListView添加如下屬性即可:
```
android:divider="@android:color/transparent"
android:dividerHeight="5dp"
```
* ListView通過AdapterView.OnItemClickListener接口來探測點擊事件。而RecyclerView則通過RecyclerView.OnItemTouchListener接口來探測觸摸事件。它雖然增加了實現的難度,但是卻給予開發人員攔截觸摸事件更多的控制權限。
* ListView可以設置選擇模式,并添加MultiChoiceModeListener,如下所示:
```
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
public boolean onCreateActionMode(ActionMode mode, Menu menu) { ... }
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) { ... }
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_delete_crime:
CrimeAdapter adapter = (CrimeAdapter)getListAdapter();
CrimeLab crimeLab = CrimeLab.get(getActivity());
for (int i = adapter.getCount() - 1; i >= 0; i--) {
if (getListView().isItemChecked(i)) {
crimeLab.deleteCrime(adapter.getItem(i));
}
}
mode.finish();
adapter.notifyDataSetChanged();
return true;
default:
return false;
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { ... }
public void onDestroyActionMode(ActionMode mode) { ... }
});
```
而RecyclerView則沒有此功能。
[http://www.cnblogs.com/littlepanpc/p/4497290.html](http://www.cnblogs.com/littlepanpc/p/4497290.html)
- JavaSE(Java基礎)
- Java基礎知識
- Java中的內存泄漏
- String源碼分析
- Java集合結構
- ArrayList源碼剖析
- HashMap源碼剖析
- Hashtable簡介
- Vector源碼剖析
- LinkedHashMap簡介
- LinkedList簡介
- JVM(Java虛擬機)
- JVM基礎知識
- JVM類加載機制
- Java內存區域與內存溢出
- 垃圾回收算法
- Java并發(JavaConcurrent)
- Java并發基礎知識
- 生產者和消費者問題
- Thread和Runnable實現多線程的區別
- 線程中斷
- 守護線程與阻塞線程的情況
- Synchronized
- 多線程環境中安全使用集合API
- 實現內存可見的兩種方法比較:加鎖和volatile變量
- 死鎖
- 可重入內置鎖
- 使用wait/notify/notifyAll實現線程間通信
- NIO
- 數據結構(DataStructure)
- 數組
- 棧和隊列
- Algorithm(算法)
- 排序
- 選擇排序
- 冒泡排序
- 快速排序
- 歸并排序
- 查找
- 順序查找
- 折半查找
- Network(網絡)
- TCP/UDP
- HTTP
- Socket
- OperatingSystem(操作系統)
- Linux系統的IPC
- android中常用設計模式
- 面向對象六大原則
- 單例模式
- Builder模式
- 原型模式
- 簡單工廠
- 策略模式
- 責任鏈模式
- 觀察者模式
- 代理模式
- 適配器模式
- 外觀模式
- Android(安卓面試點)
- Android基礎知識
- Android內存泄漏總結
- Handler內存泄漏分析及解決
- Android性能優化
- ListView詳解
- RecyclerView和ListView的異同
- AsyncTask源碼分析
- 插件化技術
- 自定義控件
- ANR問題
- Art和Dalvik的區別
- Android關于OOM的解決方案
- Fragment
- SurfaceView
- Android幾種進程
- APP啟動過程
- 圖片三級緩存
- Bitmap的分析與使用
- 熱修復的原理
- AIDL
- Binder機制
- Zygote和System進程的啟動過程
- Android中的MVC,MVP和MVVM
- MVP
- Android開機過程
- EventBus用法詳解
- 查漏補缺
- Git操作