Android开发自定义控件实用控件

给SwipeRefreshLayout添加加载更多功能

2016-12-23  本文已影响661人  水瓶鱼

github地址


下拉刷新,滑动到底部加载更多是App中很常见的功能,github上也有很多这样的开源库提供这样的功能,但大多数是在listview,recycleview等列表类上面做了一层包装,后来google推出了官方的刷新组件SwipeRefreshLayout,SwipeRefreshLayout是Android开发功常用的一个组件,使用起来很方便,但是没有加载更多这个功能,是否可以对SwipeRefreshLayout做些改动,使其能够支持加载更多呢,答案是肯定的。

首先对SwipeRefreshLayout进行分析:

public class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent,
        NestedScrollingChild 

有了大概思路之后就可以开始写代码了

  1. 新建类继承ViewGroup,并实现NestScrollingParent,NestScrollingChild
  2. 在NestScrollingParent和onInterceptTouchEvent中对用户的手势操作做判断。
  3. refresh,loadmore的显示与消失的处理
  4. 数据全部加载完成,没有更多时的显示

遇到的问题及解决办法

fling时滑动到底部loadmore的显示

因为之前对view的滑动没有太了解,所以在判断SwipeRefrshPlush中的子view是否滑动到底部时不知道该如何下手,最后还是贼SwipeRefreshLayout的源码中找到了解决方法

  public boolean canChildScrollDown() {
    if (android.os.Build.VERSION.SDK_INT < 14) {
        if (mTarget instanceof AbsListView) {
            final AbsListView absListView = (AbsListView) mTarget;
            int count = absListView.getChildCount();
            int position = absListView.getLastVisiblePosition();
            return (count > position + 1) || absListView.getChildAt(position).getBottom() <=absListView.getPaddingBottom();
        } else {
            return ViewCompat.canScrollVertically(mTarget, 1);
        }
    } else {
        return ViewCompat.canScrollVertically(mTarget, 1);
    }
}  

refresh或loadmore动画正在显示时fragment切换导致重叠

这个问题在SwipeRefreshLayout中也存在,不过以前一直没发现,导致这个问题出现的原因是ProgressDrawable中使用的是Animation动画,后来将ProgressDrawable中的动画改为Animator动画,这个问题就得到了解决。

效果图

功能及使用

使用

上一篇 下一篇

猜你喜欢

热点阅读