android UI之RecyclerView

    本篇文章是在使用RecyclerView的过程中对官方文档的翻译,由于英语水平的局限可能有的表述不太准确,后续会更新。

    原文地址RecyclerView

    1.简介

    总体来说RecyclerView是ListView的优化升级版.RecycleView中重要的组成部分包括:LayoutManager,RecyclerView.ViewHolder,RecyclerView.Adapter.下面是关于这三者的介绍

    在RecyclerView模式中,可以有几个不同的组件一起工作显示数据,你整个界面的容器是一个recycler view,它通过你提供的layout manager进行view的填充,layout manager有默认的和自定义的(默认的layout manager有LinearLayoutManager和GridLayoutManager).

 RecyclerView.ViewHolder

    list中的view通过实现RecycleView.ViewHolder的view holder对象来展示。每一个item有自己的view holder对象进行管理,当用户滚动list的时候,recycleVIew会通过回收或者缓存离开屏幕的view更改其展示的数据重新回到屏幕内,做到复用。

RecyclerView.Adapter

    通过一个RecyclerView.Adapter对象管理这些view holders对象。adapter主要工作是创建view holders,使用onBindViewHolder方法通过他们的位置进行数据的绑定


    2.RecyclerView较之ListView比较起来有一些其自身的特点,包括以下:

    (1).列表首次被填充的时候,recyclerView不仅创建和绑定了用户可见的view holders,而且在两端创建和绑定了一部分不可见的view holders,当用户滑动的时候便可以直接显示(提前创建一部分不可见 view holders)


    (2).recyclerView对view holders进行了管理和复用,当用户滚动list的时候,它只会创建必要的view holders并对离开屏幕的view holders进行保存,当用户改变滚动方向的时候,可以立马将缓存中的view进行显示;当用户一直沿着一个方向滚动的时候,recyclerView会将最早离开屏幕的view holder进行数据的改变,不需要创建新的view holder实例只需要进行数据的重绑即可。

   


    3.使用

    (1)模块的build.gradle中添加引用

implementation 'com.android.support:recyclerview-v7:27.1.1'
//(可按照自己编译的版本号进行版本的改变)

    (2) 布局

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

    (3)填充数据

 //获取RecyclerVIew对象的引用
 mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

//通过LayoutManager进行连接
 mLayoutManager = new LinearLayoutManager(this);
 mRecyclerView.setLayoutManager(mLayoutManager);

//adapter填充数据
 mAdapter = new MyAdapter(myDataset);
 mRecyclerView.setAdapter(mAdapter);

    (4)自定义Adapter内容

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) {//创建view Holder。初始化控件
        // create a new view
        TextView v = (TextView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_text_view, parent, false);
        ...
        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;
    }
}

    (5)在使用GridLayoutManager可能涉及到item之间设置间距的问题,RecyclerView对此提供了专门的RecyclerView.ItemDecoration,具体使用方法实例代码如下:

    

public class ItemDecoration extends RecyclerView.ItemDecoration {
    private int leftOffsize;
    private int rightOffsize;
    private int topOffsize;
    private int bottomOffsize;

    public ItemDecoration(int leftOffsize, int rightOffsize, int topOffsize, int bottomOffsize) {
        this.leftOffsize = leftOffsize;
        this.rightOffsize = rightOffsize;
        this.topOffsize = topOffsize;
        this.bottomOffsize = bottomOffsize;
    }



    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = leftOffsize;
        if (parent.getChildAdapterPosition(view) == 0) {
            outRect.top = topOffsize;
        }
        outRect.bottom = bottomOffsize;
        outRect.right = rightOffsize;

    }
}

   调用代码如下:

recyclerview.addItemDecoration(new ItemDecoration(10, 10, 10, 10));

关于RecyclerView更多使用的方式可以查看RecyclerView使用方法的总结









猜你喜欢

转载自blog.csdn.net/u013209460/article/details/80709258