項(xiàng)目重構(gòu)(1)——下拉刷新MVP

基本上所有的程序都會(huì)用到下拉刷新,但是需求的不同使得我們需要去使用不同的下拉刷新控件,在我的項(xiàng)目中使用了Pull-To-Refresh與SwipeRefreshLayout兩種,現(xiàn)在要統(tǒng)一效果,但是又怕直接替換后會(huì)出問(wèn)題,所以就把邏輯與控件抽離,因?yàn)檫壿嫼?jiǎn)單,就只實(shí)現(xiàn)了V部分。

ISwipeV 接口

import android.support.v7.widget.RecyclerView;

public interface ISwipeV {
    Object getSwipeObject();

    /**
     * 設(shè)置刷新?tīng)顟B(tài)
     * @param refreshing
     */
    void setRefreshing(boolean refreshing);

    /**
     * 設(shè)置是否可用
     * @param enable 是否可用
     * @param recyclerView 關(guān)聯(lián)的RecyclerView
     * @param listener 下拉刷新回調(diào)(如果禁用,則為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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評(píng)論 25 709
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,133評(píng)論 22 665
  • 聽(tīng)說(shuō)春生要離去,苗青的心空落落的,有著挖心掏肺的疼痛,眼淚禁不住“簌簌”而下,獨(dú)自一人沉浸在這落寞孤寂的時(shí)空里,“...
    西嶺布衣閱讀 250評(píng)論 0 3
  • 【獻(xiàn)給我的爸媽?zhuān)驮呓业呐笥??!?1 離家前的12個(gè)小時(shí),我在黑夜中意外失眠了。床鋪和往常一樣沒(méi)有換新,我...
    Monva11閱讀 1,180評(píng)論 5 10
  • 高騎通川,白馬不還。鎖道錚音,寒月溪澗。 我有思人,細(xì)卷菱紗。長(zhǎng)夜漫歌,飛花樓閣。 鐵衣照京,玉龍攜鳴。關(guān)山崎路,...
    卷哥是流氓閱讀 385評(píng)論 0 0

友情鏈接更多精彩內(nèi)容