RecyclerView的简单介绍

为什么叫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);

还有两个类的实现,待之后说明… …

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值