为什么叫RecyclerView?
谷歌在Android L预览版API文档中是这样描述的:
一个非常灵活的用于在有限的窗口范围内显示大量数据的控件。所以RecyclerView适用于那些有大量同类的View但是不能同时在屏幕中显示的情况,比如联系人、用户列表、音乐文件列表等等。想看到更多信息需要滚动试图,同时对离开屏幕的视图进行回收和重用。
RecyclerView本身不关心视图相关的问题
由于ListView的紧耦合问题,谷歌的改进就是RecyclerView本身不参与任何视图相关的问题。它不关心如何将子View放在合适的位置,也不关心如何分割这些子View,更不关心每个子View各自的外观。进一步来说,RecyclerView只负责回收和重用的工作,这就是它名字的由来。
所有关于布局、绘制和其他相关的问题,也就是跟数据展示相关的所有问题,都被委派给了一些”插件化”的类来处理。这使得RecyclerView的API变得非常灵活。你需要一个新的布局么?接入另一个LayoutManager就可以了!你想要不同的动画么?接入一个新的ItemAnimator就可以了,诸如此类。
以下是RecyclerView中用于数据展示的一些重要的类,他们都是RecyclerView的内部类:
Adapter:包装数据集合并且为每个条目创建视图。
ViewHolder:保存用于显示每个数据条目的子View。
LayoutManager:将每个条目的视图放置于适当的位置。
ItemDecoration:在每个条目的视图的周围或上面绘制一些装饰视图。
- ItemAnimator:在条目被添加、移除或者重排序时添加动画效果。
代码块:
FinishedFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_finished, container, false);
recycleView = (RecyclerView) view.findViewById(R.id.recycler_finished);
initData();
mLayoutManager = new LinearLayoutManager(getActivity());
recycleView.setLayoutManager(mLayoutManager);
mAdapter = new FinishedAdapter(mDatas,getActivity());
recycleView.setAdapter(mAdapter);
return view;
}
protected void initData()
{
mDatas = new ArrayList<String>();
for (int i = 1; i < 100; i++)
{
mDatas.add("" + (char) i);
}
}
FinishedAdapter.java
public class FinishedAdapter extends RecyclerView.Adapter<FinishedAdapter.ViewHolder> {
private List<String> mDateset;
private Context context;
public FinishedAdapter(List<String> myDateset, Context context){
this.mDateset = myDateset;
this.context = context;
}
@Override
public FinishedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(FinishedAdapter.ViewHolder holder, int position) {
holder.textView.setText(mDateset.get(position));
}
@Override
public int getItemCount() {
return mDateset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public ViewHolder(View itemView) {
super(itemView);
textView = (TextView)itemView.findViewById(R.id.text_view);
}
}
fragment_finished.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_finished"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
详细解说一下RecyclerView的几个类
RecyclerView.Adapter
说明:RecyclerView.Adapter实现三个方法:
public VH onCreateViewHolder(ViewGroup parent, int viewType)
public void onBindViewHolder(VH holder, int position)
public int getItemCount()
RecyclerView.ViewHolder
RecyclerView.ViewHolder的子类都可以通过ViewHolder的public的成员变量itemView来访问每个条目的根视图,所以ViewHolder子类中不需要在保存这个视图。
RecyclerView.LayoutManager
该类负责放置所有的子View到适当位置。该类有一个默认的实现:LinearLayoutManager,当要实现水平或垂直列表时可以使用该类。
mLayoutManager = new LinearLayoutManager(getActivity());
recycleView.setLayoutManager(mLayoutManager);
还有两个类的实现,待之后说明… …