RecyclerView使用體驗

weixin_34208283發表於2016-05-23

Android L推出了RecyclerView來取代ListView,初次使用這個控制元件,感覺比ListView方便多了。直觀感受就是實現橫向ListView只需要將Manager的orientation設定為horizontal。RecyclerView的特點主要有以下幾點:

  1. 通過各種LayoutManager管理Item的佈局(這塊較複雜,正在研究中)
  2. 通過繼承或者預設的ItemDecoration自定義分割線可以實現各種型別分割線,只有你想不到,哈哈
  3. 通過實現ItemAnimation控制Item的刪除,新增動畫
    大致結構:
1868403-fcd400f3b3102928.png
RecyclerView結構

基本使用:

  • 新增依賴(版本不一致,具體看更新)
...
compile'com.android.support:recyclerview-v7:21.0.+'
}```
- 佈局檔案新增該控制元件
- 關聯佈局管理器與資料來源
```mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
//建立預設的線性LayoutManager
mLayoutManager =newLinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以確定每個item的高度是固定的,設定這個選項可以提高效能
mRecyclerView.setHasFixedSize(true);
//建立並設定Adapter
mAdapter = newMyAdapter(getDummyDatas());
mRecyclerView.setAdapter(mAdapter);'''
接下來就是Adapter的建立了
'''public class MyAdapter extends RecyclerView.Adapter {
public String[] datas =null;
public MyAdapter(String[] datas) {
this.datas = datas;
}
//建立新View,被LayoutManager所呼叫
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
ViewHolder vh =newViewHolder(view);
returnvh;
}
//將資料與介面進行繫結的操作
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.mTextView.setText(datas[position]);
}
//獲取資料的數量
@Override
public int getItemCount() {
returndatas.length;
}
//自定義的ViewHolder,持有每個Item的的所有介面元素
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View view){
super(view);
mTextView = (TextView) view.findViewById(R.id.text);
}
}
}```
另附上本人對該Adapter的封裝[github上Adapter的封裝](https://github.com/TedWithAHammer/BaseRecyclerAdapter)
接下來講講自定義Item的實現,可參考[hongyang的recyclerview解析](http://blog.csdn.net/lmj623565791/article/details/45059587)
#####RecyclerView.ItemDecoration原始碼
```public static abstract class ItemDecoration{
public void onDraw(Canvas c, RecyclerView parent, State state) {
onDraw(c, parent);
}
public void onDrawOver(Canvas c, RecyclerView parent, State state) {
onDrawOver(c, parent);
}
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
parent);
}
@Deprecated
public void getItemOffsets(Rect outRect,intitemPosition, RecyclerView parent) {
outRect.set(0,0,0,0);
}```
- onDraw方法先於drawChildren
- onDrawOver在drawChildren之後,一般我們選擇複寫其中一個即可
- getItemOffsets可以通過outRect.set()為每個Item設定一定的偏移量,主要用於繪製Decorator,限定繪製區域
可以通過設定theme.xml改變分割線圖片,只要新增
```<item name="android:listDivider">@drawable/...</item>```
也可以自己寫Drawable實現漸變
再來談談比較難的一部分,也就是Manager部分,系統提供三種預設佈局器
* LinearLayoutManager 支援橫向,縱向
* GridLayoutManager 網格佈局管理器
* StaggeredGridLayoutManager用於實現瀑布式佈局
瀑布式的實現只要在onBindView裡面為Item設定不同的尺寸即可
若要隨意的佈局需重寫LayoutManager或者RecyclerView(正在研究中,希望高手指點下)
------------
說了這麼多,RecyclerView之所以強大,無非實現了ListView的功能,實現效能上的優化,使初級程式設計師也能很好的控制Item。那麼接下來看看ListView下的一些常用功能的RecyclerView實現
##### 1.常用的下拉重新整理功能(核心:實現底部與頭部的監聽)
首先我們要複寫RecyclerView在初始化函式內呼叫來監聽

addOnScrollListener(onScrollListener);
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
{
super.onScrolled(recyclerView, dx, dy);
Log.i("--------", "dx:" + dx + "dy:" + dy);
isTopOrBottom(recyclerView);
}```

1868403-c56aee6de1978d21.png
監聽回撥

若已經到頭再繼續拉動,則跟ListView原理一樣將原來的Padding慢慢的設回0

2.標籤功能

這個更加簡單隻要在RecyclerView上覆蓋一個標籤,監聽上面的onCurrentPos然後取出資料來源中對應資料,想怎麼顯示就怎麼顯示,最好判斷一下前一個pos跟當前pos是否相等,不然一滑動執行很多次比較浪費效能


相關文章