Android杂谈(28)观公司项目RecyclerView封装有感

转载请注意:http://blog.csdn.net/wjzj000/article/details/78443710

本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…
https://github.com/zhiaixinyang/PersonalCollect (拆解GitHub上的优秀框架于一体,全部拆离不含任何额外的库导入)
https://github.com/zhiaixinyang/MyFirstApp(Retrofit+RxJava+MVP)

写在前面

最近抽到了音乐组去给音乐组大佬们干些杂活,端茶送水捏捏肩啥的…

给我安排的活是重构音乐的锁屏页,所以本来是想记一记锁屏的相关内容,但是后来想了想还是等锁屏重构review过后再记录吧,免得review如果有什么更好的建议也不用再回过来改动了。所以这次记录一个我觉得很有趣的点:

因为现阶段的音乐项目需要大量的列表去展示歌曲,所以势必要用到RecyclerView或是ListView,大量的复用势必要引起封装,在我没有看到代码的时候,我以为是常规的对Adapter之类的进行封装,减少重复的Adapter的操作过程。后来看了代码才发现并没有这样而是提供了一个全新的角度和思路。

直接去封装界面的基类,在基类中进行List的展示,如果其他界面需要List的效果,直接继承,如果需要特殊的展示效果,提供全新的Adapter;总的来说就是需要什么就重写什么,如果不需要,那就直接继承走封装的界面逻辑…

还是让我们直接上代码。


开始:

1、常规的Adapter封装(BaseAdapter)

在看公司的BaseAdapter(继承自RecyclerView.Adapter)的时候,发现并没有进行比较常见的Adapter,个人猜测主要是为了更好的去拓展业务。因为Item样式的多变并没有进行对Adapter中的onBindViewHolder方法的封装。
而是仅做了一些notifyItemRemovednotifyDataSetChangednotifyItemInserted(position)这类方法的封装。所以BaseAdapter并没有什么操作。

2、常规的Adapter封装(BaseListAdapter)

下一层Adapter是BaseListAdapter,毫无疑问继承至BaseAdapter。而这里边封装了一些界面风格一致的Item,也就是说在设计师给出的Item样式相同是可以直接使用BaseListAdapter。事实上通过后续的封装,如果设计师的Item样式没有变化,Adapter这个步骤变得异常的方便…让我们往下看。

3、Fragment封装(BaseListFragment)

关于Adapter的封装并未涉及什么巧妙的设计在里边,唯一需要注意的地方就是在BaseListAdapter之中封装了常用设计风格的Item。
BaseListFragment之中,考虑了一些情况:

  • 1、对外暴露方法,动态改变LayoutManager

  • 2、对外暴露方法,动态改变Item的样式

  • 3、对外暴露方法,可以监听到滑动状态

这三个方法都比较好处理,直接把这些方法abstract出去。


1、比如:因为Adapter是必需要提供的,所以进行了abstract必须要实现

protected abstract BaseAdapter newContentAdapter();

2、比如:这里如果需要新的LayoutManager,重写这个方法return一个自己的LayoutManager即可。

protected RecyclerView.LayoutManager newLayoutManager() {
        return new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
}

3、比如:这里是对应RecyclerView的滑动回调的重写方法。这里封装的时候用的是Rx,因此这个RecyclerViewScrollEvent是Rxbinding里边的类。

protected void onRecyclerViewScrolled(RecyclerView recyclerView, RecyclerViewScrollEvent event) {}

protected void onRecyclerViewScrollStateChanged(RecyclerView recyclerView, int newState) {}

Rxbinding的方法:

Subscription scrollEventSubscribe = RxRecyclerView.scrollEvents(mRecyclerView)
                .subscribe(new SafeAction1<RecyclerViewScrollEvent>() {
                    @Override
                    public void call(RecyclerViewScrollEvent recyclerViewScrollEvent) {
                        onRecyclerViewScrolled(mRecyclerView, recyclerViewScrollEvent);
                        //省略部分代码
                        }
                    }

在这里回调了我们的onRecyclerViewScrolled(),不用Rxbinding也没啥不一样,无非是换成了addOnScrollListener对应处理一下即可:


.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });

其实这里边还涉及到了对Header的封装,不过设计的内容比较多:ItemDecoration,Buidler等,所以暂时本篇就不展开了。

BaseListFragment整体的封装思路:说白了就是处理大多数的通用情况,然后把拓展性高的业务暴露出去。
而我们如果想要使用的话:只需要继承BaseListFragment,BaseListAdapter…接下来让我们看一下对封装的使用。


使用:

如果当我想要写的界面,所展示的List的Item效果已经被封装到BaeListAdapter之中的时候,我所需要做的就是:

  • 1、继承BaseListFragment:
public class PlaylistFragment extends BaseListFragment
  • 2、继承BaseListAdapter:
//因为这里我们的Item效果已经封装好了,所以就不需要重写onBindItemViewHolder等方法
public class PlayListAdapter extends BaseListAdapter
  • 3、重写newContentAdapter,return自己实现的Adapter

完成上诉3步,一个正常的列表就可以显示了。省掉我们写自己的布局的时间。

这里还有一个好用的封装就是添加Header,我们只需要初始化我们想要展示的Header布局,然后调用封装在BaseListFragment中的mHeaderAdapter.addHeader()方法即可。当然这里边涉及到的疯转本次文章是没办法展开了,下次下次….

此外,如果我们想要处理滑动事件啊,LayoutManager,只需要复写上边提到的对外暴露的三个方法即可。


总结

其实这套思路适用在列表展示比较规格化的情况,如果嵌套十分严重,并不好进行套用。但是反过来,如果嵌套比较严重其实对应封装反而有些画蛇添足。因为复杂的业务本身就是特别且独立,个人认为这种业务并不适合封装,反而是那些重复、规模化的东西才适合进行封装。

这里记录这套业务的封装并不是为了以后的套用,而是记录一种思想。
就像我的实习导师问过我:“公司做过的大大小小的项目不知道你看过没有,你对构架上有什么看法…”
“导师写的就是吊,其他写的都是渣…”
“我们做的很多项目设计都是滞后的,很多代码都是为了业务而去写,大多数的封装还是架构都是基于业务层面的。所以一切的是基础认真写业务,业务写多了,架构自然会出来。”


尾声

最后希望各位看官可以star我的GitHub,三叩九拜,满地打滚求star:
https://github.com/zhiaixinyang/PersonalCollect
https://github.com/zhiaixinyang/MyFirstApp

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值