RecyclerView通过名称可以看出,是可以复用的view。官方对其解释为:可以在有限的窗口展示大量的数据集。其实类似的控件我们也了解很多,比如ListView,GridView.然而RecyclerView更专注于复用,也更加的灵活。下面我们就一起走进RecyclerView的世界。

基本用法

使用RecyclerView必须导入support-v7包,与ListView不相同的是,需要设置布局管理器LayoutManager,下面就分别介绍LinearLayoutManager,
GirdLayoutManager,
StaggeredGridLayoutManager,
实现ListView,GirdView,瀑布流。

首先看listview列表的实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
MyAdapter adapter = new MyAdapter(this, initData());
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//设置布局管理器LayoutManager()
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
recyclerView.setAdapter(adapter);
//初始化数据
private ArrayList initData() {
ArrayList lists = new ArrayList();
for (int i = 0; i <= 100; i++) {
lists.add(i);
}
return lists;
}
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
private ArrayList arrayList;
private Context context;
public MyAdapter(Context context, ArrayList arrayList) {
this.arrayList = arrayList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//创建一个view
MyViewHolder myViewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_recyclerview_text, parent, false));
return myViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//绑定数据到viewholder上
holder.textView.setText(arrayList.get(position) + "");
}
@Override
public int getItemCount() {
//条目的总数量
return arrayList.size();
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
}
}

xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:theme="@style/AppTheme.Base"
app:popupTheme="@style/ToolBarPopupTheme"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>

可以看出来RecyclerView更标准化了ViewHolder,Adapter面向的也是ViewHolder,而不是view。复用的逻辑进行了封装。使用的时候可以更加的灵活。

GirdView的实现

recyclerView.setLayoutManager(new GridLayoutManager(this, 4));  

this代表context,4表示spanCount列数,只需要将上面的LayoutManager改为上面的代码,是不是很方便呢。

瀑布流的实现

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));  

3代表瀑布流的列数,后面的参数可以设置横向或着纵向的瀑布流,为了演示,我们给每个模块设置一个随机的高度:

    @Override  
public void onBindViewHolder(MyViewHolder holder, int position) {  
    holder.textView.setText(arrayList.get(position) + "");  
    LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(  
            LinearLayout.LayoutParams.MATCH_PARENT, 200+(int) (Math.random()*100)  
    );  
    holder.textView.setLayoutParams(ll);  
}