RecyclerView是谷歌V7包下新增的控件,用來替代ListView的使用,在RecyclerView標(biāo)準(zhǔn)化了ViewHolder類似于ListView中convertView用來做視圖緩.
RecyclerView vs AdapterView
item復(fù)用方面:RecyclerView內(nèi)置了RecyclerViewPool、多級(jí)緩存、ViewHolder,而AdapterView需要 手動(dòng)添加ViewHolder且復(fù)用功能也沒RecyclerView更加完善
樣式豐富方面:RecyclerView通過支持水平、垂直和表格列表及其他更復(fù)雜形式,而AdapterView只支持具體某一種
效果增強(qiáng)方面:RecyclerView內(nèi)置了ItemDecoration和ItemAnimator,可以自定義繪制itemView之間的一些特殊UI或item項(xiàng)數(shù)據(jù)變化時(shí)的動(dòng)畫效果,而用AdapterView實(shí)現(xiàn)時(shí)采取的做法是將這些特殊UI作為itemView的一部分,設(shè)置可見不可見決定是否展現(xiàn),且數(shù)據(jù)變化時(shí)的動(dòng)畫效果沒有提供,實(shí)現(xiàn)起來比較麻煩.
代碼內(nèi)聚方面:RecyclerView將功能密切相關(guān)的類寫成內(nèi)部類,如ViewHolder,Adapter,而AdapterView沒有.
模板Adapter
public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.NormalTextViewHolder> {
private final LayoutInflater mLayoutInflater;
private final Context mContext;
private String[] mTitles;
public NormalRecyclerViewAdapter(Context context) {
mTitles = context.getResources().getStringArray(R.array.titles);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
@Override
public void onBindViewHolder(NormalTextViewHolder holder, int position) {
holder.mTextView.setText(mTitles[position]);
}
@Override
public int getItemCount() {
return mTitles == null ? 0 : mTitles.length;
}
public static class NormalTextViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.text_view)
TextView mTextView;
NormalTextViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("NormalTextViewHolder", "onClick--> position = " + getPosition());
}
});
}
}
}
實(shí)現(xiàn)
- 首先要用這個(gè)控件,你需要在gradle文件中添加包的引用(配合官方CardView使用)
compile 'com.android.support:cardview-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.3'
- 在XML文件用使用它
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
- 在Activity中設(shè)置它
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//這里用線性顯示 類似于listview
// mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));//這里用線性宮格顯示 類似于grid view
// mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//這里用線性宮格顯示 類似于瀑布流
mRecyclerView.setAdapter(new NormalRecyclerViewAdapter(this));
完整代碼,請(qǐng)戳我的github :jack_recyclerview_demo