1. 程式人生 > >RecyclerView替代Listview之簡單比較

RecyclerView替代Listview之簡單比較

RecycleView使用也有一段時間了,感覺有美好的時候,也有煩惱的時候;總結一下吧!
首先,我們看看google關於它的設計理念:

RecyclerView is a more advanced and flexible version of ListView. 
This widget is a container for large sets of views 
that can be recycled and scrolled very efficiently. 
Use the RecyclerView widget when you have lists with elements that
change dynamically.

它的意思是說RecyclerView是ListView的更高度定製版,可通過保持有限數量的檢視進行非常有效的滾動操作!當你需要高效的展示大量資料時候,動態改變元素的列表的時候,就用這個。
這裡已經把它的場景和優點表達出來了:大資料、動態、複用!
1、直接繼承於ViewGroup,出身簡潔,必然高效!
2、LayoutManager
RecyclerView提供了內建的佈局管理器管理子view的位置,也就是說你再不用拘泥於ListView的線性展示方式,可以使用複雜的佈局來展示一個動態元件。不過目前在佈局上支援三種StaggeredGridLayoutManager, GridLayoutManager LinearLayoutManager。要建立自定義佈局管理器,擴充套件RecyclerView.LayoutManager類。
3、ItemAnimator
ItemAnimator簡單來說是會根據介面卡上收到的相關通知去動畫的顯示元件的修改,新增和刪除等。它會自動新增和移除item的動畫。自帶的預設效果也不錯,已經非常好了。
4、RecyclerView.Adapter
一種新型介面卡,其實與以前我們使用的介面卡原理類似,封裝了viewholder;把子view的建立和繫結分開了。
5、ViewHolder
大家還記得,ListView每次都自定義ViewHolder來通過它的tag來快取檢視來優化ListView的子view的複用吧。
現在好了,這個抽象類已直接被RecyclerView收入囊中!

RecyclerVieyew的優點大家有目共睹,然而相比ListView它也有它的不足。
1、不能簡單的設定子item的點選事件。
2、分割線,多選,單選的屬性沒有提供;需要我們自己想辦法。
3 不能簡單的加頭和尾 。
這也是由它直接簡單繼承ViewGroup決定的。所以在使用的過程中,自己斟酌吧。下面看下它的簡單示例:
下列程式碼示例將展示如何將 RecyclerView 新增至佈局:

<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/>

將 RecyclerView 小元件新增至您的佈局後,立即獲取物件圖柄並將其連線至佈局管理器,同時附加一個介面卡以便顯示資料:

public class MyActivity extends Activity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        // specify an adapter (see also next example)
        mAdapter = new MyAdapter(myDataset);
        mRecyclerView.setAdapter(mAdapter);
    }
    ...
}

介面卡可讓您存取資料集中的專案,為專案建立檢視,並且在原始專案不再可見時以新資料專案替換檢視的某些內容。 下列程式碼示例將展示一個簡單的實現,目標為一個包含使用 TextView 小元件顯示的字串陣列的資料集:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private String[] mDataset;

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                               .inflate(R.layout.my_text_view, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ...
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        holder.mTextView.setText(mDataset[position]);

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}