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