1. 程式人生 > >淺談ListView和RecyclerView

淺談ListView和RecyclerView

      Listview想必大家都知道,用法更是熟的不能再熟了,但是ListView有它的侷限性,擴充套件性也不太好,比如它只能縱向滾動,無法實現橫向滾動。為此android提供了一個更強大的滾動控制元件——RecyclerView,它是一個增強版的ListView,優化了ListView中存在的各種不足,目前Android官方更加推薦使用RecyclerView.

      如何使用?

     我們在用之前還是要新增依賴庫:compile 'com.android.support:recyclerview-v7:24.2.1

     在xml佈局檔案中做如此修改:將ListView標籤改為 <android.support.v7.widget.RecyclerView/>,因為本部落格主要介紹這兩個控制元件的區別,所以不再貼上程式碼,只對他們在使用時的不同之處做一下講解。

     同樣需要一個介面卡,只是RecyclerView繼承RecyclerView.Adapter<MyAdapter.ViewHolder>  當然ViewHolder是MyAdapter的內部類。這樣MyAdapter就必須重寫RecyclerView.Adapter的三個方法onCreateViewHolder(),載入佈局檔案,建立ViewHolder例項,返回值為ViewHolder; onBindViewHolder(),為控制元件賦值處理資料;getItemCount()返回RecycleView一共有多少子項也就是說資料集的資料條數目。

    與ListView相比,分工更明確,更容易理解。

     Activity的onCreate()方法中我們需要建立一個LayoutManager用來指定RecyclerView的佈局方式:LinearLayoutManager線性佈局,GridLayoutManager網格佈局和StaggeredGridLayoutManager瀑布流佈局。

    下面舉例說明:

     LinearLayoutManager:

       LinearLayoutManager layoutManager = new LinearLayoutManager(this)
       recyclerView.setLayoutManager(layoutManager);
         LinearLayoutManager預設是vertical豎向排列,若是想橫向滾動排列,設定item佈局的寬度為定值,比如100dp,onCreate()方法中再加一行程式碼
       layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL)

     StaggeredGridLayoutManager:

              需要修改item佈局檔案的layout_width = match_parent,不能設定為指定值,因為瀑布流佈局的寬度應該是根據佈局的列數來自動適配的。

         onCreate()方法中應該這樣寫

       StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,,StaggeredGridLayoutManager.VERTICAL);
       recyclerView.setLayoutManager(layoutManager);
            3代表了列數,StaggeredGridLayoutManager.VERTICAL代表了瀑布流的方向,表示佈局縱向排列

       還要一個值得一提的知識就是RecyclerView的點選事件。

       RecyclerView沒有像ListView一樣的setOnItemClickListener()事件,而是需要我們自己給子項具體的View設定註冊點選事件,這個在onCreateViewHolder中去寫點選事件就OK了。

       像我們認為很複雜的聊天記錄介面,用這個RecyclerView去實現最合適不過了。

       最後我再寫兩個RecycleView最常用的2個方法,當我們的資料來源改變需要更新adapter時,用adapter.notifyItemInserted(size - 1);當我們需要定位到最後一行,保證使用者隨時看到最新的,就像QQ聊天介面一樣,我們需要用到 recyclerView.scrollToPosition(size-1).

       好了,這個講完了,下個專案,大家是不是可以嘗試用RecyclerView而不是ListView了呢?哈哈。