RecyclerView比ListView更高级且更具灵活性。此组件是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作。如果您有数据集合,其中的元素将因用户操作或者网络事件而发生改变,建议使用RecyclerView。
RecyclerView通过提供下列功能来简化庞大数据集的显示与处理:
- 用于项目定位的布局管理器
- 用于通用项目操作(例如删除或添加Item)的默认动画
如果要使用RecyclerView组件,必须指定一个Adapter和一个LayoutManager。通过集成RecyclerView.Adapter的方式可以自定义一个Adapter。实现Adapter的详情将取决于数据集的具体信息以及视图的类型。
LayoutManager LayoutManager决定RecyclerView内各项视图的位置并决定何时重新使用用户已不可见的项目视图。 如果要重新使用(或者重复使用)一个视图,LayoutManager可能会要求Adapter以数据集中的另一个元素替换视图的内容。以此方式重复使用视图将可避免创建不必要的视图或执行非常耗的
findViewById,从而改善性能。 RecyclerView提供提供了一下内置布局管理器:
- LinearLayoutManager 以垂直或者水平滚动列表方式显示Item,如右图:
- GridLayoutManager 以网格方式显示Item
- StaggeredGridLayoutManager 在分散对齐网格中显示Item
Animation RecyclerView默认情况下,当增加或者删除Item时,带有动画效果。如果要定制某些其他效果的动画,需要扩展RecyclerView.ItemAnimator类,并使用RecyclerView.setItemAnimator设置所定制的动画。
以下是RecyclerView使用的代码示例: 下列代码展示如何将RecyclerView添加至布局:
<!-- RecyclerView的通用属性 -->将RecyclerView添加至布局之后,可以在Java代码中获取起引用,并与LayoutManager相关联,同时设置一个Adapter用来显示数据,如下所示:
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
public class MyActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
...
}
Adapter 适配器的功能是为数据源中的每一个Item创建一个视图,并且当之前的Item不可见时,以新的Item进行替换。下列代码示例将展示一个简单的实现,目标为包含一个TextView显示字符串列表的组件:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
// set the view's size, margins, paddings and layout parameters
...
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
最后不要忘记需要添加依赖:
dependencies {
...
compile 'com.android.support:recyclerview-v7:21.0.+'
}