项目重构(1)——下拉刷新MVP

基本上所有的程序都会用到下拉刷新,但是需求的不同使得我们需要去使用不同的下拉刷新控件,在我的项目中使用了Pull-To-Refresh与SwipeRefreshLayout两种,现在要统一效果,但是又怕直接替换后会出问题,所以就把逻辑与控件抽离,因为逻辑简单,就只实现了V部分。

ISwipeV 接口

import android.support.v7.widget.RecyclerView;

public interface ISwipeV {
    Object getSwipeObject();

    /**
     * 设置刷新状态
     * @param refreshing
     */
    void setRefreshing(boolean refreshing);

    /**
     * 设置是否可用
     * @param enable 是否可用
     * @param recyclerView 关联的RecyclerView
     * @param listener 下拉刷新回调(如果禁用,则为null)
     */
    void setEnable(boolean enable, RecyclerView recyclerView, SwipeRefreshListener listener);

    interface SwipeRefreshListener {
        void onRefreshBegin();
    }
}

Pull-To-Refresh

import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;

public class PullToRefreshV implements ISwipeV {
    private PtrFrameLayout ptrMaterialFrameLayout;

    public PullToRefreshV(View view) {
        init(view);
    }

    private void init(View view) {
        ptrMaterialFrameLayout = (PtrFrameLayout) view.findViewById(R.id.list_material_style_ptr_frame);
    }

    @Override
    public Object getSwipeObject() {
        return ptrMaterialFrameLayout;
    }

    @Override
    public void setRefreshing(final boolean refreshing) {
        if (ptrMaterialFrameLayout == null) return;
        ptrMaterialFrameLayout.post(new Runnable() {
            @Override
            public void run() {
                change(refreshing);
            }
        });
    }

    @Override
    public void setEnable(boolean enable, final RecyclerView recyclerView, final SwipeRefreshListener listener) {
        ptrMaterialFrameLayout.setEnabled(enable);
        if (enable) {
            ptrMaterialFrameLayout.setPtrHandler(new PtrHandler() {
                @Override
                public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
                    return PtrDefaultHandler.checkContentCanBePulledDown(frame, recyclerView, header);
                }

                @Override
                public void onRefreshBegin(PtrFrameLayout frame) {
                    listener.onRefreshBegin();
                }
            });
        }
    }

    private void change(boolean refreshing) {
        if (ptrMaterialFrameLayout != null && ptrMaterialFrameLayout.isRefreshing() != refreshing) {
            Log.d("loading", "setRefreshing " + refreshing);

            if (refreshing) {
                ptrMaterialFrameLayout.autoRefresh(true);
            } else {
                ptrMaterialFrameLayout.refreshComplete();
            }
        }
    }
}

SwipeRefreshLayout

import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.caidou.R;

public class SwipeV implements ISwipeV {
    private SwipeRefreshLayout swipeRefreshLayout;
    private SwipeRefreshListener mListener;

    public SwipeV(View view) {
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.list_material_style_ptr_frame);
        if (swipeRefreshLayout != null)
            swipeRefreshLayout.setColorSchemeResources(R.color.blue);
    }

    @Override
    public Object getSwipeObject() {
        return swipeRefreshLayout;
    }

    @Override
    public void setRefreshing(boolean refreshing) {
        if (swipeRefreshLayout != null)
            swipeRefreshLayout.setRefreshing(refreshing);
        if (refreshing)
            mListener.onRefreshBegin();
    }

    @Override
    public void setEnable(boolean enable, RecyclerView recyclerView, SwipeRefreshListener listener) {
        this.mListener = listener;
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mListener.onRefreshBegin();
            }
        });
    }
}

具体的使用就看各位了

约定:

V = View,M = Model,P = Presenter

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,292评论 25 709
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 47,046评论 22 665
  • 听说春生要离去,苗青的心空落落的,有着挖心掏肺的疼痛,眼泪禁不住“簌簌”而下,独自一人沉浸在这落寞孤寂的时空里,“...
    西岭布衣阅读 1,549评论 0 3
  • 【献给我的爸妈,和曾走近我的朋友。】 1 离家前的12个小时,我在黑夜中意外失眠了。床铺和往常一样没有换新,我...
    Monva11阅读 4,750评论 5 10
  • 高骑通川,白马不还。锁道铮音,寒月溪涧。 我有思人,细卷菱纱。长夜漫歌,飞花楼阁。 铁衣照京,玉龙携鸣。关山崎路,...
    卷哥是流氓阅读 2,790评论 0 0

友情链接更多精彩内容