美文网首页安卓控件系列Android知识Android开发
一个实现上拉加载更多的 SwipeRefreshLoadLayo

一个实现上拉加载更多的 SwipeRefreshLoadLayo

作者: 代码在码我 | 来源:发表于2017-03-12 13:57 被阅读999次

    SwipeRefreshLayout中包裹一个可滑动的子控件,如ListView、RecyclerView等,可以实现竖直滑动时刷新页面的需求,注意其布局只能包裹一个子控件,然后通过设置OnRefreshListener实现监听

    SwipRefreshLayout官网介绍

    但其没有提供上拉加载更多的布局交互。这里通过这继承SwipeRefreshLayout定义SwipeRefreshLoadLayout,实现其包裹的ListView或RecyclerView具有上拉加载功能。

    实现:

    1.于onLayout方法中获取子控件,并于此对ListView或RecyclerView设置滑动监听(mListView.setOnScrollListener / mRecyclerView.addOnScrollListener),这里可以通过设置SwipeRefreshLoadLayout中的一个自定义属性type(0为ListView,1为RecyclerView)来区分包裹的子控件类型

    2.判断用户滑动子控件距离是否满足加载更多的条件,即:

    ①用户是上拉操作 :dispatchTouchEvent(MotionEvent ev)中处理分发事件,可由此获得相应手指触摸与抬起的对应坐标,当然在MotionEvent.ACTION_MOVE状态下还应判断是否为上拉加载更多的状态

    避免下拉刷新同时加载

    && ②当前可见页面item为最后一项:

    mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() -1)

    ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == manager.getItemCount() -1;

    && ③不在加载状态中

    3.在加载更多时使子控件的加载更多的布局可见,加载完消失。在设置加载状态时:

    ①ListView的设置布局状态比较简单,通过addFooterView(mFooterView) / removeFooterView(mFooterView)的方法就可实现;

    ②RecyelerView没有提供相应的方法,我们需要通过继承RecyclerView.Adapter自定义一个RecyclerViewAdapter,在列表数据最后一项通过判断其ItemViewType添加一个上拉加载的Footer布局:

    FooterView也为item,mSwitch为控制其显示与否的开关

    RecyclerViewAdapter中设置FooterView可见或不可见

    然后在getItemViewType中通过判断其是否为最后一项并且是否为加载状态(即mSwitch为1)得到特定的ItemViewType

    mSwitch为关键,于此判断是否处于加载状态开启Footer

    最后复写RecyclerViewAdapter相应onCreateViewHolder、onBindViewHolder方法通过ItemVIewType创建绑定相应的ViewHolder来实现item的显示与一个上拉加载的Footer布局。

    源码

    相关文章

      网友评论

        本文标题:一个实现上拉加载更多的 SwipeRefreshLoadLayo

        本文链接:https://www.haomeiwen.com/subject/pkitnttx.html