万能刷新库(android-Ultra-Pull-To-Refresh )

之前一篇文章已经介绍了万能刷新库的时候,那个库是基于BGARefreshLayout 这个库进行的,后来通过这篇文章,发现廖百万的刷新库也能牛逼,可扩展性十分高,遗憾的是没有加入bga刷新库的对比,所以取舍还得看自己。

言归正传,开工,以美团为例。

  • 添加依赖
    compile 'in.srain.cube:ultra-ptr:1.0.11'
    compile 'in.srain.cube:clog:1.0.2'
    compile 'in.srain.cube:cube-sdk:1.0.44.39-SNAPSHOT@aar'
  • 布局文件
<in.srain.cube.views.ptr.PtrFrameLayout
        android:id="@+id/store_house_ptr_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        cube_ptr:ptr_duration_to_close="200"
        cube_ptr:ptr_duration_to_close_header="1000"
        cube_ptr:ptr_keep_header_when_refresh="true"
        cube_ptr:ptr_pull_to_fresh="false"
        cube_ptr:ptr_ratio_of_header_height_to_refresh="1"
        cube_ptr:ptr_resistance="2.0">

       <任意view>

    </in.srain.cube.views.ptr.PtrFrameLayout>
  • 定义刷新头
    对不起,要开大咯。
public class MeiTuanHeader extends FrameLayout implements PtrUIHandler {
    ImageView headerImg;
    private PtrTensionIndicator mPtrTensionIndicator;
    PtrFrameLayout mPtrFrameLayout;
    View view;
    public MeiTuanHeader(Context context) {
        super(context);
        init(context);
    }

    public MeiTuanHeader(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public MeiTuanHeader(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public void init(Context context) {
         view = LayoutInflater.from(context).inflate(R.layout.meituanheader, this, false);
        addView(view);
        headerImg = (ImageView) view.findViewById(R.id.header_img);
    }
    public void setUp(PtrFrameLayout ptrFrameLayout) {
        mPtrFrameLayout = ptrFrameLayout;
        mPtrTensionIndicator = new PtrTensionIndicator();
        mPtrFrameLayout.setPtrIndicator(mPtrTensionIndicator);
    }

    @Override
    public void onUIReset(PtrFrameLayout frame) {

    }

    @Override
    public void onUIRefreshPrepare(PtrFrameLayout frame) {

    }

    @Override
    public void onUIRefreshBegin(PtrFrameLayout frame) {
        AnimationDrawable animationDrawable;
        headerImg.setImageResource(R.drawable.change);
        animationDrawable= (AnimationDrawable) headerImg.getDrawable();
        animationDrawable.start();
    }

    @Override
    public void onUIRefreshComplete(PtrFrameLayout frame) {
        headerImg.clearAnimation();
        headerImg.setImageResource(R.drawable.bga_refresh_mt_pull_down);
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
        final int mOffsetToRefresh = frame.getOffsetToRefresh();
        final int currentPos = ptrIndicator.getCurrentPosY();
        final int lastPos = ptrIndicator.getLastPosY();

        if (currentPos < mOffsetToRefresh ) {
            //未到达刷新线
            if (status == PtrFrameLayout.PTR_STATUS_PREPARE) {
                headerImg.setImageResource(R.drawable.bga_refresh_mt_pull_down);
                headerImg.setScaleX((float) currentPos / mOffsetToRefresh);
                headerImg.setScaleY((float) currentPos / mOffsetToRefresh);
            }
        } else if (currentPos > mOffsetToRefresh ) {
            //到达或超过刷新线
            if (isUnderTouch && status == PtrFrameLayout.PTR_STATUS_PREPARE) {
                AnimationDrawable animationDrawable;
                headerImg.setImageResource(R.drawable.fanshen);
                animationDrawable= (AnimationDrawable) headerImg.getDrawable();
                animationDrawable.start();
            }
        }
    }
}
  • Activity中添加头,监听
private void MeiTuanRefresh() {
        MeiTuanHeader header = new MeiTuanHeader(MeiTuanActivity.this);
        storeHousePtrFrame.setHeaderView(header);
        storeHousePtrFrame.addPtrUIHandler(header);
        storeHousePtrFrame.setPtrHandler(new PtrHandler() {
            @Override
            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
                 return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
            }

            @Override
            public void onRefreshBegin(PtrFrameLayout frame) {
                storeHousePtrFrame.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        storeHousePtrFrame.refreshComplete();
                    }
                }, 1800);
            }
        });
    }

ok,步骤差不多完成,上效果图。(算了,效果图跟之前差不多,传送门

刷新功能已经完成,可在其基础上任意的拓展,遗憾的是没有加载更多,原作者说了,加载更多是任意view的事情,跟我木有关系,好吧,那咱就只能针对listview,gridview还有recyclerview自己封装写footer了,具体demo略。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用 van-pull-refresh 和 van-list 的示例代码: ```vue <template> <van-pull-refresh v-model="refreshing" @refresh="onRefresh"> <van-list :loading="loading" :finished="finished" :error="error" @load="onLoad"> <van-cell v-for="(item, index) in list" :key="index">{{ item }}</van-cell> </van-list> </van-pull-refresh> </template> <script> export default { data() { return { refreshing: false, loading: false, finished: false, error: false, list: [], page: 1, limit: 10 }; }, methods: { onRefresh() { this.refreshing = true; setTimeout(() => { this.page = 1; this.list = ['Item 1', 'Item 2', 'Item 3']; this.finished = false; this.refreshing = false; }, 1000); }, onLoad() { if (this.loading || this.finished) { return; } this.loading = true; setTimeout(() => { if (this.list.length >= 40) { this.finished = true; } else { this.page++; this.list.push(`Item ${this.page * this.limit - 8}`, `Item ${this.page * this.limit - 7}`, `Item ${this.page * this.limit - 6}`, `Item ${this.page * this.limit - 5}`, `Item ${this.page * this.limit - 4}`, `Item ${this.page * this.limit - 3}`, `Item ${this.page * this.limit - 2}`, `Item ${this.page * this.limit - 1}`, `Item ${this.page * this.limit}`); } this.loading = false; }, 1000); } } }; </script> ``` 在这个示例中,我们使用 van-pull-refresh 包裹 van-list,并且监听其 @refresh 事件来触发下拉刷新。同时,van-list 组件中的一些属性(如 loading、finished、error)和事件(如 @load)可以用于控制和监听列表的加载情况。在 onRefresh 和 onLoad 方法中,我们可以根据需要进行数据的请求和更新。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值