Recycler介紹:RecyclerView是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好。接下來通過一系列的文章講解如何使用RecyclerView,徹底拋棄ListView.
RecylerView和ListView的目的性其實都是去維護少量的View來展示大量的數據集,而RecyclerView的優點在於提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。
- 如果你想要控制它的顯示方式,就可以使用LayoutManager
- 如果你想要自定義item分割線,可以使用ItemDecoration
- 如果你想要item的增刪動畫,可以使用ItemAnimator
但是對於RecylerView來說,它並不像ListView一樣直接給你提供了OnItemClickListener、OnItemClickLongListener這樣的點擊事件,以至於你想實現點擊事件需要通過你自己來實現這些.下面我們就來談一談關於RecyclerView的基本使用吧.
添加依賴
dependencies {
compile 'com.android.support:recyclerview-v7:24.0.0'
.........
}
在XML佈局中
<android.support.v7.widget.RecyclerView
android:id="@+id/mList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
沒有什麼特別的地方、和ListView一樣
需要一個RecyclerView適配器
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.Demo>{
private String[] data;
private Context mContext;
public DemoAdapter(String[] datas, Context context){
this.data = datas;
mContext = context;
}
@Override
public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
return new Demo(rootView);
}
@Override
public void onBindViewHolder(Demo holder, int position) {
holder.imageView.setImageResource(R.drawable.back_default);
holder.textView.setText(data[position]);
}
@Override
public int getItemCount() {
return data.length;
}
class Demo extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
public Demo(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.iv_1);
textView = itemView.findViewById(R.id.tv_1);
}
}
}
比較簡單的一個使用,在OnCreateViewHolder中創建視圖,在onBindViewHolder中綁定視圖數據,RecyclerView是自動複用視圖的,所以不需要像listView中使用代碼去做,當然你也可以手動來設置不復用,獲取OnCreateViewHolder中創建出來的holder,holder.setIsRecyclable(false);
LayoutManager
其實SDK中自帶了三種LayoutManager
- LinearLayoutManager
- GridLayoutManager
- StaggeredGridLayoutManager
分別是 - 線性佈局:可以設置橫向和縱向
- 網格佈局:可以在設置多少行列、以及橫向縱向
- 瀑布流佈局
使用
以上這些必要的工作已經做好了嗎,下面我們就來試一下RecyclerView的簡單使用吧
RecyclerView mRecyclerView = findViewById(R.id.mListView)
mRecyclerView.setLayoutManager(new LinearLayoutManager(this))
mRecyclerView.setAdapter(new DemoAdapter(data,this))
這樣就出現一個簡單的RecyclerView列表
關於RecyclerView的點擊事件
RecyclerView是沒有像ListView那樣很直白的點擊事件的,這就需要我們自己來進行處理了,
我們可以在
@Override
public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
return new Demo(rootView);
}
這部分代碼中、對rootView進行點擊事件
rootView.setOnClickListener(new OnClickListener(){
………
})
那麼我們怎麼來傳遞當前的點到這個位置的值呢、我們並沒有看到position這個參數
其實是可以的,看看怎麼做
@Override
public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
Demo demo = new Demo(rootView);
int position = demo.getAdapterPosition()
return demo
}
這樣就獲取到了position,我們也可以在內部創建一個自己的監聽接口、將點擊的這個事件傳遞到外面,這樣就可以做到和listView一樣的寫法,我就姑且不在這裏做了。
結尾
剩下的還有一些自己來定義動畫、自己定義layoutManger、分割線、以及使用中遇到的一些坑,我們下次再說