Android新元件RecyclerView介紹,其效率更好

乞力馬紮羅的雪CYF發表於2015-10-01

今天我們首先來說為什麼要介紹這個新元件RecyclerView,因為前幾天我釋出了一個常用面試題ListView的複用及如何優化的文章,介紹給一些開發者,但是我看到有關的反饋說:現在都不再用listview了,代替的是RecyclerView,確實是,但是用的畢竟是少數,所以可能很多人對於這個元件不是很瞭解,那麼我們就來介紹一下吧!

1、什麼是RecyclerView

RecyclerView 是 android-support-v7-21 版本中新增的一個 Widgets,官方對於它的介紹則是:RecyclerView 是 ListView 的升級版本,更加先進和靈活。

簡單來說就是:RecyclerView是一種新的檢視組,目標是為任何基於介面卡的檢視提供相似的渲染方式。它被作為ListView和GridView控制元件的繼承者,在最新的support-V7版本中提供支援。

2、用RecyclerView注意哪些方面,怎麼用

雖然RecyclerView充分考慮了它的擴充套件性,更好用,更靈活,但是用起來也有些麻煩。所以要使用RecyclerView,要好好考慮以下幾點:

(1)、RecyclerView.Adapter

(2)、LayoutManager

(3)、ItemAnimator

第一點:RecyclerView.Adapter

RecyclerView.Adapter包含了一種新型介面卡,其實與以前我們使用的介面卡基本類似,只是稍微有所不同,比如viewholder它幫我們封裝好了,不用像以前使用listview的介面卡一樣自己去寫viewholder了。所以它的效能比以前應該好了不少。廢話不多說了,介面卡例子如下:

package com.pandastudios.pandastudios.adapter;

import android.support.v7.widget.RecyclerView;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

import com.pandastudios.pandastudios.R;

import java.util.List;

/**

* Created by loonggg on 15/7/18.

*/

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private List<String> list;

/**

* 這裡和使用listview時使用的adapter基本一樣,都是要傳入資料集合的

*

* @param list

*/

public MyAdapter(List<String> list) {

this.list = list;

}

@Override

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

View view = View.inflate(viewGroup.getContext(), R.layout.rv_item, null);

ViewHolder holder = new ViewHolder(view);

return holder;

}

@Override

public void onBindViewHolder(ViewHolder viewHolder, int i) {

viewHolder.tv.setText(list.get(i));

}

@Override

public int getItemCount() {

return list.size();

}

public static class ViewHolder extends RecyclerView.ViewHolder {

public TextView tv;

public ViewHolder(View itemView) {

super(itemView);

tv = (TextView) itemView.findViewById(R.id.item_tv);

}

}

public void add(String item, int position) {

list.add(position, item);

notifyItemInserted(position);

}

public void remove(String item) {

int position = list.indexOf(item);

list.remove(position);

notifyItemRemoved(position);

}

}

第二點:LayoutManager

這個LayoutManager類決定檢視被放在畫面中哪個位置,但這只是它的眾多職責之一。它可以管理滾動和迴圈利用。LayoutManager只有一個叫做LinearLayoutManager的實現類,我們可以設定它的橫向和縱向。

第三點:ItemAnimator

ItemAnimator簡單來說是會根據介面卡上收到的相關通知去動畫的顯示元件的修改,新增和刪除等。它會自動新增和移除item的動畫。自帶的預設效果也不錯,已經非常好了。

3、RecyclerView優點和缺點

優點:

RecyclerView本身它是不關心檢視相關的問題的,由於ListView的緊耦合的問題,google的改進就是RecyclerView本身不參與任何檢視相關的問題。它不關心如何將子View放在合適的位置,也不關心如何分割這些子View,更不關心每個子View各自的外觀。更進一步來說就是RecyclerView它只負責回收和重用的工作,這也是它名字的由來。

所有關於佈局、繪製和其他相關的問題,也就是跟資料展示相關的所有問題,都被委派給了一些”外掛化”的類來處理。這使得RecyclerView的API變得非常靈活。你需要一個新的佈局麼?接入另一個LayoutManager就可以了!你想要不同的動畫麼?接入一個新的ItemAnimator就可以了,諸如此類等等。

缺點:

在RecyclerView中,沒有一個onItemClickListener方法。所以目前在介面卡中處理這樣的事件比較好。如果想要從介面卡上新增或移除條目,需要明確通知介面卡。這與先前的notifyDataSetChanged()方法稍微有些不同。具體操作在介面卡程式碼中就可以體現。

整體總結它的幾點如下:

Adapter:包裝資料集合並且為每個條目建立檢視。

ViewHolder:儲存用於顯示每個資料條目的子View。

LayoutManager:將每個條目的檢視放置於適當的位置。

ItemDecoration:在每個條目的檢視的周圍或上面繪製一些裝飾檢視。

ItemAnimator:在條目被新增、移除或者重排序時新增動畫效果。


原文連結:http://toutiao.com/a4741480788/?iid=2940446160&app=news_article&tt_from=mobile_qq&utm_source=mobile_qq&utm_medium=toutiao_ios&utm_campaign=client_share


github主頁:https://github.com/chenyufeng1991  。歡迎大家訪問!

相關文章