多种下拉刷新效果、上拉加载更多、可配置自定义头部广告位

Related tags

Layout refreshlayout
Overview

🏃 BGARefreshLayout-Android 🏃

Android Arsenal License Download

开发者使用 BGARefreshLayout-Android 可以对各种控件实现多种下拉刷新效果、上拉加载更多以及配置自定义头部广告位

测试 BGARefreshLayout 与 Activity、Fragment、ViewPager 的各种嵌套的 Demo

常见问题-加载更多视图无法显示

1.BGARefreshLayout 的直接子控件的高度请使用 android:layout_height="0dp" 和 android:layout_weight="1"

<cn.bingoogolapple.refreshlayout.BGARefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_modulename_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- BGARefreshLayout 的直接子控件 -->
    <AnyView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</cn.bingoogolapple.refreshlayout.BGARefreshLayout>

2.如果是在 Fragment 中使用 BGARefreshLayout

请在 onCreateView 方法中初始化 BGARefreshLayout,不要在 onActivityCreated 方法中初始化

目前已经实现了四种下拉刷新效果:

  • 新浪微博下拉刷新风格(可设置各种状态是的文本,可设置整个刷新头部的背景)
  • 慕课网下拉刷新风格(可设置其中的 logo 和颜色成自己公司的风格,可设置整个刷新头部的背景)
  • 美团下拉刷新风格(可设置其中的图片和动画成自己公司的风格,可设置整个刷新头部的背景)
  • 类似 qq 好友列表黏性下拉刷新风格(三阶贝塞尔曲线没怎么调好,刚开始下拉时效果不太好,可设置整个刷新头部的背景)

一种上拉加载更多效果

  • 新浪微博上拉加载更多(可设置背景、状态文本)

开发者也可以继承 BGARefreshViewHolder 这个抽象类,实现相应地抽象方法做出格式各样的下拉刷新效果【例如实现 handleScale(float scale, int moveYDistance) 方法,根据 scale 实现各种下拉刷新动画】和上拉加载更多特效,可参考 BGAMoocStyleRefreshViewHolder、BGANormalRefreshViewHolder、BGAStickinessRefreshViewHolder、BGAMeiTuanRefreshViewHolder 的实现方式。

目前存在的问题

  • 当配置自定义头部广告位可滚动时,内容区域和广告位还不能平滑过度。
  • 当 BGAStickyNavLayout 中嵌套 RecyclerView 或 AbsListView,并且第一页的最后一个 item 刚好在最底部时,加载更多视图会悬浮在最后一个 item 上面
  • 正在刷新或加载更多时,用户上下滑动不会让下拉刷新视图和加载更多视图跟着滑动

效果图

bga_refreshlayout1 bga_refreshlayout2 bga_refreshlayout3 bga_refreshlayout4 bga_refreshlayout5 bga_refreshlayout6

基本使用

1.添加 Gradle 依赖

  • maven { url 'https://jitpack.io' } 添加到 root build.gradle 的 repositories 中
  • 在 app build.gradle 中添加如下依赖,末尾的「latestVersion」指的是徽章 里的版本名称,请自行替换
dependencies {
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.github.bingoogolapple:BGARefreshLayout-Android:latestVersion'
}

2.在布局文件中添加 BGARefreshLayout

注意:内容控件的高度请使用 android:layout_height="0dp" 和 android:layout_weight="1"

<cn.bingoogolapple.refreshlayout.BGARefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_modulename_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 内容控件 -->
    <AnyView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</cn.bingoogolapple.refreshlayout.BGARefreshLayout>

3.在 Activity 或者 Fragment 中配置 BGARefreshLayout

// 让 activity 或者 fragment 实现 BGARefreshLayoutDelegate 接口
public class ModuleNameActivity extends AppCompatActivity implements BGARefreshLayout.BGARefreshLayoutDelegate {
    private BGARefreshLayout mRefreshLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_moudlename);

        initRefreshLayout();
    }

    private void initRefreshLayout(BGARefreshLayout refreshLayout) {
        mRefreshLayout = (BGARefreshLayout) findViewById(R.id.rl_modulename_refresh);
        // 为BGARefreshLayout 设置代理
        mRefreshLayout.setDelegate(this);
        // 设置下拉刷新和上拉加载更多的风格     参数1:应用程序上下文,参数2:是否具有上拉加载更多功能
        BGARefreshViewHolder refreshViewHolder = new XXXImplRefreshViewHolder(this, true))
        // 设置下拉刷新和上拉加载更多的风格
        mRefreshLayout.setRefreshViewHolder(refreshViewHolder);


        // 为了增加下拉刷新头部和加载更多的通用性,提供了以下可选配置选项  -------------START
        // 设置正在加载更多时不显示加载更多控件
        // mRefreshLayout.setIsShowLoadingMoreView(false);
        // 设置正在加载更多时的文本
        refreshViewHolder.setLoadingMoreText(loadingMoreText);
        // 设置整个加载更多控件的背景颜色资源 id
        refreshViewHolder.setLoadMoreBackgroundColorRes(loadMoreBackgroundColorRes);
        // 设置整个加载更多控件的背景 drawable 资源 id
        refreshViewHolder.setLoadMoreBackgroundDrawableRes(loadMoreBackgroundDrawableRes);
        // 设置下拉刷新控件的背景颜色资源 id
        refreshViewHolder.setRefreshViewBackgroundColorRes(refreshViewBackgroundColorRes);
        // 设置下拉刷新控件的背景 drawable 资源 id
        refreshViewHolder.setRefreshViewBackgroundDrawableRes(refreshViewBackgroundDrawableRes);
        // 设置自定义头部视图(也可以不用设置)     参数1:自定义头部视图(例如广告位), 参数2:上拉加载更多是否可用
        mRefreshLayout.setCustomHeaderView(mBanner, false);
        // 可选配置  -------------END
    }

    @Override
    public void onBGARefreshLayoutBeginRefreshing(BGARefreshLayout refreshLayout) {
        // 在这里加载最新数据

        if (mIsNetworkEnabled) {
            // 如果网络可用,则加载网络数据
            new AsyncTask<Void, Void, Void>() {

                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        Thread.sleep(MainActivity.LOADING_DURATION);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    // 加载完毕后在 UI 线程结束下拉刷新
                    mRefreshLayout.endRefreshing();
                    mDatas.addAll(0, DataEngine.loadNewData());
                    mAdapter.setDatas(mDatas);
                }
            }.execute();
        } else {
            // 网络不可用,结束下拉刷新
            Toast.makeText(this, "网络不可用", Toast.LENGTH_SHORT).show();
            mRefreshLayout.endRefreshing();
        }
    }

    @Override
    public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) {
        // 在这里加载更多数据,或者更具产品需求实现上拉刷新也可以

        if (mIsNetworkEnabled) {
            // 如果网络可用,则异步加载网络数据,并返回 true,显示正在加载更多
            new AsyncTask<Void, Void, Void>() {

                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        Thread.sleep(MainActivity.LOADING_DURATION);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    // 加载完毕后在 UI 线程结束加载更多
                    mRefreshLayout.endLoadingMore();
                    mAdapter.addDatas(DataEngine.loadMoreData());
                }
            }.execute();

            return true;
        } else {
            // 网络不可用,返回 false,不显示正在加载更多
            Toast.makeText(this, "网络不可用", Toast.LENGTH_SHORT).show();
            return false;
        }
    }

    // 通过代码方式控制进入正在刷新状态。应用场景:某些应用在 activity 的 onStart 方法中调用,自动进入正在刷新状态获取最新数据
    public void beginRefreshing() {
        mRefreshLayout.beginRefreshing();
    }

    // 通过代码方式控制进入加载更多状态
    public void beginLoadingMore() {
        mRefreshLayout.beginLoadingMore();
    }

}

更多详细用法请查看 Wiki 或者 Demo

Demo 中使用到了我的另外三个库,欢迎大家 Star 😄

关于我

个人主页 邮箱 BGA 系列开源库 QQ 群 GitHub 喵(专注于 GitHub 等一切与程序员有关的内容)
bingoogolapple.cn [email protected] BGA_CODE_CLUB GitHub喵

打赏支持

如果觉得 BGA 系列开源库对您有用,请随意打赏。如果猿友有打算购买 Lantern,可以使用我的邀请码「YFQ9Q3B」购买,双方都赠送三个月的专业版使用时间。

License

Copyright 2015 bingoogolapple

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • 请教上拉动画显示的问题

    请教上拉动画显示的问题

    工程中只引入了 compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.nineoldandroids:library:2.4.0' compile 'cn.bingoogolapple:bga-refreshlayout:1.1.2@aar' 这个三个库, 刷新ViewHolder设置成 BGARefreshViewHolder refreshViewHolder = new BGANormalRefreshViewHolder(context, true); bgaRefreshLayout.setIsShowLoadingMoreView(true);也设置为true 但是上拉刷新的 footview 显示不出来求解原因? 是否和DEMO中没有引入其他库有关系? 谢谢

    opened by zjyangyong 3
  •  BGARefreshLayout+BGAStickyNavLayout问题。求解

    BGARefreshLayout+BGAStickyNavLayout问题。求解

    超出后

    fda01eb6-9a57-4aa2-919d-4718fd678df3

    原始图

    Uploading C495D7B7-0FCD-4557-83EC-1E8ACD0C29CA.png…

    当BGAStickyNavLayout 中的第一个子View高度超出屏幕的高度是,只能下拉,布局不能往上走,当在下拉的时候拖动布局是,可以看出层次错误了。

    第一个子view超过屏幕高度后,超出的不显示,而且下面的布局会被遮挡,第二个和第三个会向上padding掉第一个子view超出屏幕的距离

    opened by AnMokoto 3
  • 1.1.1版本会造成闪退 、Recursive entry to executePendingTransactions

    1.1.1版本会造成闪退 、Recursive entry to executePendingTransactions

    E/AndroidRuntime: FATAL EXCEPTION: main java.lang.IllegalStateException: Recursive entry to executePendingTransactions at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1585) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5069) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)

    compile 'cn.bingoogolapple:bga-refreshlayout:1.1.1@aar' 我的主程序是ViewPager +TabLayout;ViewPager 包含fragment 其中有一个fragment 使用了BGARefreshLayout。之前用的是1.0.7版本没有问题。然后改成1.1.1就闪退了

    opened by tcxdawn 3
  • 下拉刷新头部无法出现

    下拉刷新头部无法出现

    1.1.0版本,当嵌套recycleview时,如果第一个单元格的高度过大(超出一屏),会导致下拉刷新的头部出不来,我尝试着定位了一下问题,发现在ScrollingUtil.java(63)处,layoutManager.findFirstCompletelyVisibleItemPosition()方法获取到的值始终为-1,导致判定失效,我试着加入了==-1的判定条件,现在头部是可以出来了,但是不确定是否对其他部分会造成影响

    opened by xym0519 3
  • BGARefreshLayout 内部嵌套一个FrameLayout FrameLayout里面是一个RecyclerView 上拉有问题

    BGARefreshLayout 内部嵌套一个FrameLayout FrameLayout里面是一个RecyclerView 上拉有问题

    FrameLayout 是作为loading empty 和 error的视图展示 里面放了一个recycleview 我给FrameLayout设置高度为0dp weight 为1 在数据返回的时候 我调用自定义的framelayout 显示 我的recycleview 视图,这时候在上拉 recycleview不能滚动,并且上拉item 没有到最后一个,麻烦 请看下这个问题,或者给我一些建议

    opened by haonan1 2
  • 上拉加载更多时,底部不显示加载中了??

    上拉加载更多时,底部不显示加载中了??

    mRefreshLayout.setDelegate(BgaRefreshActivity.this); BGARefreshViewHolder refreshViewHolder = new BGANormalRefreshViewHolder(this, true); mRefreshLayout.setRefreshViewHolder(refreshViewHolder); refreshViewHolder.setLoadingMoreText("加载中....");

    <cn.bingoogolapple.refreshlayout.BGARefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/base_bga_refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/base_bga_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
    

    </cn.bingoogolapple.refreshlayout.BGARefreshLayout>

    opened by wwg90 2
  • 滑动冲突

    滑动冲突

    <cn.bingoogolapple.refreshlayout.BGARefreshLayout android:id="@+id/mRefreshLayout" style="@style/MatchMatch"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" style="@style/MatchMatch"

                        android:overScrollMode="never"
                        android:paddingLeft="@dimen/dimen2"
                        android:paddingRight="@dimen/dimen2"
                        android:scrollbars="none"
                        tools:listitem="@layout/item_mystrategy" />
    
    
        </cn.bingoogolapple.refreshlayout.BGARefreshLayout>
    

    下拉刷新的时候,会产生冲突,RecyclerView做瀑布流的时候未滑动到顶部,下拉就会刷新了

    opened by 921668753 2
Releases(v1.0.3)
  • v1.0.3(Jun 14, 2015)

    • 修改beginRefreshing和beginLoadingMore方法,调用这两个方法时会触发delegate方法
    • 为delegate的onBGARefreshLayoutBeginLoadingMore方法添加boolean类型的返回参数。如果要开始加载更多则返回true,否则返回false。(返回false的场景:没有网络、一共只有x页数据并且已经加载了x页数据了)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Jun 14, 2015)

    • 公开BGARefreshLayout的beginRefreshing和beginLoadingMore方法,方便刚进入界面时自动进入刷新状态。但是调用这两个方法时不会触发delegate方法,开发者需单独调用onBGARefreshLayoutBeginRefreshing(mRefreshLayout)方法(参考iOS中的UIRefreshControl,不晓得这样是好是坏)
    • 为delegate方法增加BGARefreshLayout参数
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Jun 14, 2015)

    • 结束上拉加载更多从以前的endRefreshing()改为endLoadingMore()
    • 刷新和加载更多过程中,内容控件可接收触摸事件
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Jun 14, 2015)

Owner
王浩
自助者天助之,学习ing
王浩