集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就行啦.如下可見
- 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]);
- }
--------------------------------------------------------------------------------------------------
關於具體怎麼實現的話,我想網上應該有很多這樣的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包,選擇與你專案版本匹配的即可.
--------------------------------------------------------------------------------------------
新手入門,錯誤之處還望指導. = =...