分析:RecyclerView和ListView的異同

  • ViewHolder是用來保存視圖引用的類,無論是ListView亦或是RecyclerView。只不過在ListView中,ViewHolder需要自己來定義,且這只是一種推薦的使用方式,不使用當然也可以,這不是必須的。只不過不使用ViewHolder的話,ListView每次getView的時候都會調(diào)用findViewById(int),這將導致ListView性能展示遲緩。而在RecyclerView中使用RecyclerView.ViewHolder則變成了必須,盡管實現(xiàn)起來稍顯復雜,但它卻解決了ListView面臨的上述不使用自定義ViewHolder時所面臨的問題。

  • 我們知道ListView只能在垂直方向上滾動,Android API沒有提供ListView在水平方向上面滾動的支持?;蛟S有多種方式實現(xiàn)水平滑動,但是請想念我,ListView并不是設(shè)計來做這件事情的。但是RecyclerView相較于ListView,在滾動上面的功能擴展了許多。它可以支持多種類型列表的展示要求,主要如下:

    • LinearLayoutManager,可以支持水平和豎直方向上滾動的列表。
    • StaggeredGridLayoutManager,可以支持交叉網(wǎng)格風格的列表,類似于瀑布流或者Pinterest。
    • GridLayoutManager,支持網(wǎng)格展示,可以水平或者豎直滾動,如展示圖片的畫廊。
  • 列表動畫是一個全新的、擁有無限可能的維度。起初的Android API中,刪除或添加item時,item是無法產(chǎn)生動畫效果的。后面隨著Android的進化,Google的Chat Hasse推薦使用ViewPropertyAnimator屬性動畫來實現(xiàn)上述需求。 相比較于ListView,RecyclerView.ItemAnimator則被提供用于在RecyclerView添加、刪除或移動item時處理動畫效果。同時,如果你比較懶,不想自定義ItemAnimator,你還可以使用DefaultItemAnimator。

  • ListView的Adapter中,getView是最重要的方法,它將視圖跟position綁定起來,是所有神奇的事情發(fā)生的地方。同時我們也能夠通過registerDataObserver在Adapter中注冊一個觀察者。RecyclerView也有這個特性,RecyclerView.AdapterDataObserver就是這個觀察者。ListView有三個Adapter的默認實現(xiàn),分別是ArrayAdapter、CursorAdapter和SimpleCursorAdapter。然而,RecyclerView的Adapter則擁有除了內(nèi)置的內(nèi)DB游標和ArrayList的支持之外的所有功能。RecyclerView.Adapter的實現(xiàn)的,我們必須采取措施將數(shù)據(jù)提供給Adapter,正如BaseAdapter對ListView所做的那樣。

  • 在ListView中如果我們想要在item之間添加間隔符,我們只需要在布局文件中對ListView添加如下屬性即可:

    android:divider="@android:color/transparent"
    android:dividerHeight="5dp"
    
  • ListView通過AdapterView.OnItemClickListener接口來探測點擊事件。而RecyclerView則通過RecyclerView.OnItemTouchListener接口來探測觸摸事件。它雖然增加了實現(xiàn)的難度,但是卻給予開發(fā)人員攔截觸摸事件更多的控制權(quán)限。

  • ListView可以設(shè)置選擇模式,并添加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) { ...}
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容