1. 程式人生 > >集ListView+GridView+瀑布流於一身的RecyclerView

集ListView+GridView+瀑布流於一身的RecyclerView

   自己新控制元件的學習方法首先是看效果,再學習怎麼實現,當然在實現過程中難免會遇到各種問題,所謂塞翁失馬焉知非福,解決問題的過程能夠更好幫助我們接觸到更深層次的東西.廢話不多說.

   --------------------------------------------------------------------------------------------------

    RecyclerView的效果的話,如題,一個控制元件可實現三種效果.那麼問題來了,與這三控制元件相比,RecyclerView到底有什麼優勢.

    撿簡單的來講把,最明顯的好處即"舉一反三",用RecyclerView通過設定LayoutManager(佈局管理器)即可控制其顯示方式是ListView或GridView又或瀑布流,簡單粗暴.

    再者,RecyclerView新增靈活性,所謂的靈活,就是放手讓你去闖,那麼你面臨的是自由,又是挑戰.你能夠實現更炫酷的動畫,你也需要自己手動新增更多約束.舉個例子來講,RecyclerView以ListView的形態顯示時,你可以通過ItemAnimator設定Item增刪的動畫(想想就很炫酷),但是,Item的點選事件需要自己手動新增(系統並沒有提供這些).

    有圖有真相,附一張Demo執行出來的圖片把.

   

這個介面的實現是頭佈局+瀑布流的身子.這樣看起來是不是很炫酷!!RecyclerView的使用難就難在Adapter的實現(好好努力 - -).

    再看RecyclerView這個名字,recycler是再迴圈的意思,還記得ListView的Adapter裡提供的getView()方法中的引數contentView把,我們做的優化是利用其儲存我們的ViewHolder把,RecyclerView的Adapter是直接將ViewHolder封裝起來,我們只需要實現自己的ViewHolder就行啦.如下可見

  1. public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,  
  2.                                                    int viewType) {  
  3.         // create a new view  
  4.         View v = LayoutInflater.from(parent.getContext())  
  5.                                .inflate(R.layout.my_text_view, parent, false);  
  6.         // set the view's size, margins, paddings and layout parameters  
  7.         ...  
  8.         ViewHolder vh = new ViewHolder(v);  
  9.         return vh;  
  10.     }  
  11.     // Replace the contents of a view (invoked by the layout manager)  
  12.     @Override  
  13.     public void onBindViewHolder(ViewHolder holder, int position) {  
  14.         // - get element from your dataset at this position  
  15.         // - replace the contents of the view with that element  
  16.         holder.mTextView.setText(mDataset[position]);  
  17.     } 

        --------------------------------------------------------------------------------------------------

關於具體怎麼實現的話,我想網上應該有很多這樣的Demo,畢竟RecyclerView已經並不陌生了,我這裡主要想分享一下自己在實現過程中遇到過的問題.

    RecyclerView位於v7包,在SDK下extras的android裡就有啦.只需要RecyclerView的話直接把jar包拿出來用就行.

   問題一:

   The hierarchy of the type MainActivity is inconsistent

   出現這個問題的原因可能是匯入的Jar包不完整,v7包裡的RecyclerView要依賴V4包裡的控制元件,如果v4包比較舊的話就不行了.這樣的話,解決方法是在SDK Manager中升級Android-Support-Library至最新,再將v7和v4包匯入到專案中.

   問題二:

   Caused by :java.lang.NoClassDefFoundError :android.support.v7.recyclerview.R$styleable.

   這個問題是我在執行的時候出現的.我的解決方法是,更換匯入的recyclerview的jar包,位置如下...\sdk\extras\android\m2repository\com\android\support\recyclerview-v7,在這裡面應該是有不同版本的jar包,選擇與你專案版本匹配的即可.

--------------------------------------------------------------------------------------------

                                                                        新手入門,錯誤之處還望指導.  = =...