A flexible view for providing a limited window into a large data set.
以上是Google api對(duì)于RecyclerView的介紹砸紊,RecyclerView用于為大型數(shù)據(jù)集提供有限的窗口诲祸,與ListView一樣是一個(gè)列表類型的控件古话,不過(guò)RecyclerView比ListView更加靈活夜只,RecyclerView不進(jìn)可以在垂直方向顯示列表找都,還可以在水平方向顯示列表锅棕,亦可以像GridView一樣顯示網(wǎng)格列表秉宿。
RecyclerView的使用
RecyclerView和ListView的基本使用時(shí)一致的隆豹,都是需要一個(gè)數(shù)據(jù)源,一個(gè)列表樣式適配器贼涩,不過(guò)相較于ListView巧涧,RecyclerView需要加入依賴,因?yàn)镽ecyclerView并不是原生的控件遥倦,而是放在support包里面的:
compile 'com.android.support:recyclerview-v7:28.0.0'
加入依賴包之后就可以在布局文件xml里面正常引用了:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_white"/>
RecyclerView的布局Manager
之前也有提到過(guò)谤绳,RecyclerView可以實(shí)現(xiàn)ListView一樣的列表樣式,也可以實(shí)現(xiàn)GridView一樣的網(wǎng)格樣式袒哥,更可以實(shí)現(xiàn)RecyclerView獨(dú)有的瀑布流樣式(當(dāng)然自定義也可以實(shí)現(xiàn)瀑布流)缩筛,都要?dú)w功于RecyclerView的LayoutManager:
- LinerLayoutManager(線性):以垂直或者水平列表方式展示Item
- GridLayoutManager (網(wǎng)格):以網(wǎng)格方式展示Item
- StaggeredGridLayoutManager(瀑布流): 以瀑布流方式展示Item
簡(jiǎn)單的使用方法如下所示:
//垂直方向的線性列表布局
LinearLayoutManager verticalLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
//水平方向的線性列表布局
LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
//網(wǎng)格樣式布局
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
//瀑布流布局
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(verticalLayoutManager);
當(dāng)然,每一個(gè)Manager的參數(shù)有什么含義堡称,感興趣的可以查看源碼更深入的去了解瞎抛,但是基本上重寫RecyclerView去實(shí)現(xiàn)更加多樣的效果的新控件,也基本上是不會(huì)動(dòng)Manager的却紧。
RecyclerView的適配器Adapter
之前有提到ListView的適配器Adapter的使用和相關(guān)的優(yōu)化方式桐臊,而RecyclerView的Adapter都完美的繼承并優(yōu)化了ListView的適配器的優(yōu)點(diǎn)。但是晓殊,RecyclerView的適配器還是有些地方?jīng)]有實(shí)現(xiàn)断凶,就是每一項(xiàng)的點(diǎn)擊事件,按照Google官方給的答復(fù)是巫俺,使用者可以自定義點(diǎn)擊事件认烁,更加靈活方便,Adapter的簡(jiǎn)單使用如下:
public class RecyclerTestAdapter extends RecyclerView.Adapter<RecyclerTestAdapter.ViewHolder> {
private List<String> dataList;
private Context mContext;
private OnTestAdapterClickListener mOnTestAdapterClickListener;
public RecyclerTestAdapter(List<String> dataList, Context context) {
this.dataList = dataList;
mContext = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler_view, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
viewHolder.tvText.setText(dataList.get(i));
viewHolder.llRoot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnTestAdapterClickListener != null) {
mOnTestAdapterClickListener.onItemClick(i);
}
}
});
viewHolder.tvText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnTestAdapterClickListener != null) {
mOnTestAdapterClickListener.onTextClick(i);
}
}
});
}
@Override
public int getItemCount() {
return dataList.size();
}
public void setOnTestAdapterClickListener(OnTestAdapterClickListener onTestAdapterClickListener) {
mOnTestAdapterClickListener = onTestAdapterClickListener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
LinearLayout llRoot;
TextView tvText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
llRoot = itemView.findViewById(R.id.item_root);
tvText = itemView.findViewById(R.id.tv_item_text);
}
}
public interface OnTestAdapterClickListener{
void onItemClick(int position);
void onTextClick(int position);
}
}
當(dāng)然更復(fù)雜的使用介汹,需要多重寫一些adapter的其他方法却嗡,同一個(gè)列表根據(jù)下標(biāo),或者是其他的什么標(biāo)識(shí)嘹承,根據(jù)情況來(lái)顯示不同樣式的布局稽穆,等等各種各樣的深度使用,這都需要深入的去查看源碼赶撰,研究學(xué)習(xí)使用。
RecyclerView的列表decoration和animator
RecyclerView的列表每一項(xiàng)的分割線顯示和ListView的顯示不一樣柱彻,ListView的分隔符可以在xml屬性里面設(shè)置豪娜,RecyclerView的分隔符使用的是單獨(dú)的一個(gè)類ItemDecoration,這是一個(gè)抽象類哟楷,如果想要自定義每一項(xiàng)之間的分隔符瘤载,就需要繼承ItemDecoration并重寫相關(guān)方法,注入自己想要的分隔符的效果卖擅。并通過(guò)add方法鸣奔,添加到想要該效果的RecyclerView上面去:
recyclerView.addItemDecoration(new TestItemDecoration());
RecyclerView的列表每一項(xiàng)滑出屏幕墨技、滑出屏幕都可以自定義出獨(dú)特的動(dòng)畫,可以用ItemAnimator這個(gè)抽象類挎狸,正常情況下扣汪,都是不設(shè)置,使用的是support包里面的默認(rèn)動(dòng)畫DefaultItemAnimator類锨匆,也可以繼承ItemAnimator類并重寫相關(guān)方法崭别,只需要通過(guò)set方法設(shè)置一下就可以了:
recyclerView.setItemAnimator(new DefaultItemAnimator());