使用它的理由:

RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically.

简单说,它是ListView的进化,为了当你需要动态展示一组数据的时候就会需要它。

当然,如果只是动态展示数据,listview也可以做到,用它替代listview的原因有几个:

·简介中提到的它封装了viewholder的回收复用。

·RecyclerView使用布局管理器管理子view的位置(目前尚只提供了LinearLayoutManager),也就是说你再不用拘泥于ListView的线性展示方式,如果之后提供其他custom LayoutManager的支持,你能够使用复杂的布局来展示一个动态组件。

·自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。

如果你想简单地入门这个组件,请参考

官方样例:

xml:

<!-- A RecyclerView with some commonly used attributes -->

<android.support.v7.widget.RecyclerView

    android:id="@+id/my_recycler_view"

    android:scrollbars="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"/>

main code:

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);


        // improve performance if you know that changes in content

        // do not change the 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 code:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private String[] mDataset;


    // Provide a reference to the type of views that you are using

    // (custom viewholder)

    public static class ViewHolder extends RecyclerView.ViewHolder {

        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;

    }

}

替用Gallery:

笔者使用RecyclerView的原因其实并不是为了使用一个新颖的组件去实现华丽的功能,就在前一天我还在到处寻找一个可以替代deprecated组件Gallery的组件。在android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager 中我介绍了ListView嵌套ViewPager显示图片的办法。其实在Gallery弃用之后,RecyclerView出来之前,ViewPager和扩展ScrollView是StackOverFlow上推荐的实现Gallery的两种解决办法,但是都有一定的问题,ScrollView要实现Gallery的改动太大,ViewPager替用的滑动体验和原来的Gallery相去甚远。

顺着官方demo,我替换掉原来的ViewPager类,使用RecylcerView,改进有以下几点:

·使用过ViewPager动画的应该知道(有经典的ViewPager动画第三方扩展JazzyViewPager),这些动画是为了提供给每个item占据全屏,或占据几乎全屏这种情况设计的。也就是说,如果你简单地将ViewPager的每页显示数设置为你需要的值,之后设置的动画很可能并不是你需要的效果(因此之前我在嵌套时去掉了ViewPager的动画,稍微有点失望)。

·滑动速度加快,因为ViewPager并不是ViewsPager。。。一次长距离的滑动可能只造成1~2张图片的滚动,一点也不像gallery,这是我用RecylcerView替代它的主要原因。

基于原来的代码,我构建了MyRecyclerGallery,保留了原来的触摸事件,现在滑动起来舒服多了:


你可以看到滑动时还有滚动条。

事件机制和原来一样,RecyclerView的关键代码没有变化,所以就不放出源码了。


转载于:https://my.oschina.net/huil/blog/351533

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐