Android 刷新加载BGARefreshLayout

BGARefreshLayout-Android

简介:多种下拉刷新效果、上拉加载更多、可配置自定义头部广告位
更多: 作者    提 Bug   
标签:
下拉刷新-

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">
&lt;!-- BGARefreshLayout 的直接子控件 --&gt;
&lt;AnyView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" /&gt;

</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 依赖

Download bga-refreshlayout 后面的「latestVersion」指的是左边这个 Download 徽章后面的「数字」,请自行替换。

dependencies {
    implementation 'com.android.support:recyclerview-v7:27.0.2'
    implementation 'com.android.support:support-v4:27.0.2'
    implementation 'cn.bingoogolapple:bga-refreshlayout:latestVersion@aar'
}
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">
&lt;!-- 内容控件 --&gt;
&lt;AnyView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" /&gt;

</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&lt;Void, Void, Void&gt;() {

            @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&lt;Void, Void, Void&gt;() {

            @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 :smile:

关于我

个人主页邮箱BGA 系列开源库 QQ 群
bingoogolapple.cnbingoogolapple@gmail.comBGA_CODE_CLUB

打赏支持

如果觉得 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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于SwipeRefreshLayout下拉刷新、上拉。支持所有的AbsListView、RecycleView 特点  在 layout 中使用,支持 AbsListView 所有的xml属性  支持自动下拉刷新,什么用呢?比如进入界面时,只需要调用 autoRefresh() 方法即可,同时下拉刷新回调函数将会被调用。  上拉支持自定义 View 或设置文字、动画  轻松设置 Adapter 空数据视图,默认为 TextView 支持更文字,也可自定义 View  对于简单的界面,如只有 ListView 可以继承 app 包中 Fragment 轻松搞定 效果图 使用 仔细看 listSelector 属性,效果见 sample <com.mylhyl.prlayout.SwipeRefreshListView xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@ id/swipeRefresh"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:listSelector="@drawable/selector_list"     tools:context=".app.ListViewXmlFragment" /> 设置上拉,更多方法见 IFooterLayout         IFooterLayout footerLayout = swipeRefreshListView.getFooterLayout();         footerLayout.setFooterText("set自定义");         footerLayout.setIndeterminateDrawable(getResources().getDrawable(R.drawable.footer_progressbar)); 自定义adapter空数据视图         ImageView emptyView = new ImageView(getContext());         emptyView.setImageResource(R.mipmap.empty);         swipeRefreshGridView.setEmptyView(emptyView); 或         swipeRefreshListView.setEmptyText("数据呢?"); 使用Gradle构建时添一下依赖即可: compile 'com.mylhyl:pullrefreshlayout:1.0.0' QQ交流群:435173211

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值