项目重构(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

你可能感兴趣的:(项目重构(1)——下拉刷新MVP)