天天看点

Recyclerview用法浅析recyclerview用法浅析

recyclerview用法浅析

从14年大谷歌推出RecyclerView控件以来,哥就一直想用,在最近一个项目中如愿以偿(哥就这么点追求)。

界面的设计和需求是这样的,需要一个可滑动的展示banner,一组按类别的分类页面入口,剩余是热门推荐(一看就是用listview风格的设计,自行脑补下),而且整个页面要可以滑动,大体貌似现在团购app的首页。

Recyclerview用法浅析recyclerview用法浅析

原来的实现是scrollview包裹banner、linearlayout、recyclerview,完美。。。

但是问题来了:

  • 产品改需求了,分类需要动态加载,根据服务端的返回显示
  • scrollview嵌套recyclerview的时候,滑动会卡顿,以5.0为界,莫名5.0及以上就不流畅了,尝试了一些解决方法后并不如意
  • scrollview实现的刷新和加载更多功能也用的不如意

    于是想基于recyclerview重写此界面。

    在介绍具体的之前,推荐一个很好用的带有加载和刷新功能的recyclerview库,https://github.com/Aspsine/SwipeToLoadLayout,作者是国人,我还和他有过简短的交流(在issue里面。。。)其它还有很多好用的库,我就不一一推荐了。

好了,铺垫完了,开始正题。基于recyclerview该如何实现设计效果,(本文不特意介绍recyclerview的基本使用知识,如有需要可参考http://frank-zhu.github.io/android/2015/01/16/android-recyclerview-part-1/系列文章)ListView时代,我们可以在Adapter的getView中对不同position inflater不同布局。同样在recyclerview中提供了类似的方法onCreateViewHolder(ViewGroup parent, int viewType) ,由viewType控制绘制的界面。注意,这儿是viewType,不同于position,我刚开始想当然的以为viewType是listview中的position效果,于是我绘制界面时出现了按position加载界面后,引用错的ViewHolder代码,App fc的情况。实际情况是viewType可以是自定义的枚举类型,不一定要连续常量,只要能标志你的布局情况即可。viewType和position的对应关系在getItemViewType(int position)中映射完成。系统自动把position位置的view投射到相应的viewType上。

上面啰嗦了这么多,简单的缕一缕adapter绘制view的流程,adapter中重要的几个函数

getViewTypeCount方法是用来获取当前listview总共有多少种类型的布局。

@Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    }

    @Override
    public int getItemViewType(int position) {
    }

    @Override
    public int getItemCount() {
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
                }
            });
        }
    }
           

其中onCreateViewHolder按viewType类型加载不同的布局并返回给指定的ViewHolder对象持有。某个viewType包含的position由getItemViewType指定。getItemCount告知adapter有多少个position item需要绘制,onBindViewHolder将数据设置到每个viewHolder的布局控件上(如果是嵌套使用RecyclerView等情况,将adapter绑定到控件),最后还有一个Viewholder的内部类,持有需要绘制对象的引用 。

在这儿顺便说下RecyclerView的点击响应,网上有很多提到这部分的文章,但他们讲的和我自己理解的思路不一样,所以我这儿说下自己的思路,方便和我思维方式接近的童鞋理解。

RecyclerView没有提供基本的点击接口,那用户如何点击某个控件呢?在adapter中,onCreateViewHolder()完成了view的加载,而每个view都可以实现OnClickListener接口响应点击,于是我们现在可以在adapter中点击并监听,那如何在activity(fragment)中点击并响应呢?想必了解回调的同学可以想到,实现一个接口,接口中的方法作为回调函数,在adapter中的点击处理事件里将actiivty(fragment)需要的值作为参数传递给回调函数,同时在activity(fragment)调用adapter的监听器设置函数,将接口对象传入到adapter中(在adapter中调用回调函数的对象即由activity等传入)。

好了,RecyclerView的方法间的关系和事件点击,想必大家有了个初步的了解。

文章还在不断改进中,to be continued…

继续阅读