RecyclerView小部件比 ListView更高級且更具靈活性。 此小部件是一個用于顯示龐大數(shù)據(jù)集的容器,可通過保持有限數(shù)量的視圖進(jìn)行非常有效的滾動操作。 如果您有數(shù)據(jù)集合,其中的元素將因用戶操作或網(wǎng)絡(luò)事件而在運(yùn)行時發(fā)生改變,請使用RecyclerView小部件。——這是官方描述
RecyclerView官方文檔
12月8號出的 .cn官方API文檔
RecyclerView的系列的文章
- 第一篇RecyclerView的基本使用 RecyclerView使用(一)
- 第二篇有關(guān)多種Item,添加,刪除 RecyclerView使用(二)
- 第三篇RecyclerView的監(jiān)聽方法RecyclerView使用(三)
- 第四篇RecyclerView的拖動和滑動刪除RecyclerView使用(四)
我準(zhǔn)備通過一系列的文章講解如何使用RecyclerView,徹底拋棄ListView。為什么這么說,我們可以通過設(shè)置RecyclerView的LayoutManager,ItemDecoration , ItemAnimator實(shí)現(xiàn)各種效果。
- LayoutManager(布局管理器):有三種:線性式布局LinearLayoutManager(相當(dāng)于ListView),表格式布局GridLayoutManager(相當(dāng)于GridView),瀑布式布局StaggeredGridLayoutManager(用來實(shí)現(xiàn)瀑布流)
- ItemDecoration:控制Item間的間隔(隨便自定義)
- ItemAnimator :控制Item的增加刪除的動畫(可自定義)
- 控制點(diǎn)擊事件,長按事件,需要自己寫(之后會寫一篇文章介紹)
- ItemTouchHelper:完成對RecyclerView的拖動與滑動刪除
一、一般使用步驟:
- 準(zhǔn)備容器(設(shè)置recyclerView的相關(guān)操作)
- 準(zhǔn)備數(shù)據(jù)(一般為從網(wǎng)上請求回的數(shù)據(jù))
- 設(shè)置Adapter
1.準(zhǔn)備容器
- 引包
第一步圖.png
第二步圖.png
第三步圖.png
- 在xml寫RecyclerView控件
- 設(shè)置它的相關(guān)操作
//初始化
RecyclerView rcShow = (RecyclerView) findViewById(R.id.rc_show);
//實(shí)例化,參數(shù)為context上下文
LinearLayoutManager manager = new LinearLayoutManager(this);
//設(shè)置布局管理器
rcShow.setLayoutManager(manager);
2.準(zhǔn)備數(shù)據(jù)
public void initData(){
//實(shí)例化List
list = new ArrayList<>();
//循環(huán)添加數(shù)據(jù)
for (int i = 0; i < 30; i++){
list.add("這是第" + i + "個");
}
}
3.設(shè)置Adapter
- 創(chuàng)建一個類,繼承RecyclerView.Adapter 注: 這個時候分兩種情況, 一種是只有一個ViewHolder時,寫<創(chuàng)建的ViewHolder內(nèi)部類>,另一種有多個ViewHolder時,不用寫<>,但是需要寫一個getItemViewType方法來判斷是哪一個view,哪一個ViewHolder,之后會詳細(xì)講
- 繼承三個方法,onCreateViewHolder(創(chuàng)建視圖) onBindViewHolder(填充數(shù)據(jù)) getItemCount(獲取數(shù)量)。
- 在這是寫一個xml用顯示item的布局
- 切記切記切記:在創(chuàng)建視圖時,第二個參數(shù)要寫parent(創(chuàng)建視圖方法中的ViewGroup parent參數(shù)),否則顯示不正常。
- 在ViewHolder(用來緩存)中初始化那些控件。
View view = LayoutInflater.from(context).inflate(R.layout.main_item,parent,false);
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
private ArrayList<String> list;//要顯示的數(shù)據(jù)
private Context context;//創(chuàng)建視圖時需要
/*
多參的構(gòu)造方法
*/
public MainAdapter(ArrayList<String> list, Context context) {
this.list = list;
this.context = context;
}
/**
* 創(chuàng)建視圖
*/
@Override
public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//創(chuàng)建視圖
View view = LayoutInflater.from(context).inflate(R.layout.main_item,parent,false);
//實(shí)例化MainViewHolder---- 傳View過去
MainViewHolder holder = new MainViewHolder(view);
return holder;
}
/**
* 初始化控件
*/
public class MainViewHolder extends RecyclerView.ViewHolder{
TextView tvShow;
public MainViewHolder(View itemView) {
super(itemView);
//初始化控件
tvShow = (TextView)itemView.findViewById(R.id.tv_show);
}
}
/**
* 填充數(shù)據(jù)
*/
@Override
public void onBindViewHolder(MainViewHolder holder, int position) {
//獲取要填充的值
String content = list.get(position);
//控件中設(shè)置值
holder.tvShow.setText(content);
}
/**
* 獲取item的總個數(shù)
*/
@Override
public int getItemCount() {
return list.size();
}
}
- 之后在Activity中
//實(shí)例化一個MainAdapter對象
MainAdapter adapter = new MainAdapter(list,MainActivity.this);
//設(shè)置adapter
rcShow.setAdapter(adapter);
二、其他布局使用
GridLayoutManager
第一個參數(shù)為context上下文,第二個參數(shù)想讓一行顯示幾個Item
//實(shí)例化
GridLayoutManagerGridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
//設(shè)置布局管理器
rcShow.setLayoutManager(gridLayoutManager);
注意,在Grid布局中也可以設(shè)置列表的Orientation屬性,來實(shí)現(xiàn)橫向和縱向的布局。
gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);
StaggeredGridLayoutManager
- 第一個參數(shù)為一行(列)顯示幾個Item,第二個參數(shù)布局滾動的方向(StaggeredGridLayoutManager.VERTICAL 垂直,StaggeredGridLayoutManager.HORIZONTAL 水平)
//實(shí)例化StaggeredGridLayoutManager對象
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
//設(shè)置布局管理器
rcShow.setLayoutManager(staggeredGridLayoutManager);
然后為了模擬瀑布流的高度
在之前填充數(shù)據(jù)的方法里
//實(shí)例化對象
Random random = new Random();
//獲取隨機(jī)的整數(shù)型數(shù)值
int height = random.nextInt(1001);
//設(shè)置TextView高度
holder.tvShow.setHeight(height);
然后就完了
三、設(shè)置Item的間隔(ItemDecoration)
- 繼承 RecyclerView.ItemDecoration,重寫getItemOffsets的方法,對其參數(shù)outRect賦值即可。
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpacesItemDecoration(int space){
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.left=space;
outRect.right=space;
outRect.bottom=space;
outRect.top=space;
}
}
- 在Activity中
//實(shí)例化SpacesItemDecoration對象
SpacesItemDecoration spacesItemDecoration = new SpacesItemDecoration(10);
//設(shè)置線寬
rcShow.addItemDecoration(spacesItemDecoration);
如果需要更復(fù)雜的使用,可以看這篇文章
http://blog.piasy.com/2016/03/26/Insight-Android-RecyclerView-ItemDecoration/