MVP - 自己在項目中的使用方式

1. MVP簡介


M就是model,里邊放的是javabean蛾绎;
V就是View昆箕,就是Activity、Fragment租冠;
P就是Presenter鹏倘;

2. 自己使用


全局需要定義:

定義BaseView、BasePresenter肺稀,BaseView是View的父類第股,BasePresenter是Presenter的父類;

舉例:這里以請求HomeFragment的 BannerView輪播圖數(shù)據(jù)為例话原,結(jié)構(gòu)如下:
圖片.png

由上圖可以看出

1>:整個項目底部來回切換的多個fragment都是放在ui包下邊的;

2>:自己手動新建一個contract包诲锹,定義HomeFragmentContract接口繁仁,在里邊定義View繼承BaseView,里邊的方法用于給Activity或者Fragment回調(diào)归园;定義Presenter繼承BasePresenter黄虱,里邊的方法用于寫具體的聯(lián)網(wǎng)請求的邏輯代碼,目的就是把具體聯(lián)網(wǎng)請求的方法和給Activity庸诱、Fragment中提供的方法分開捻浦,達(dá)到最大程度解耦晤揣;

下邊以home首頁的fragment為例,定義4個包朱灿,分別是contract昧识、model、view盗扒、presenter跪楞;

3. 具體分析


3.1:定義HomeFragmentContract接口,代碼如下:

/**
 * Email: 2185134304@qq.com
 * Created by JackChen 2018/4/8 17:34
 * Version 1.0
 * Params:
 * Description:  :Home主頁面
*/
public interface HomeFragmentContract {

    //View(activity/fragment)繼承侣灶,需要實現(xiàn)的方法
    interface View extends BaseView {
        //設(shè)置輪播圖
        void setBanner(BannerView mBanner, List<Object> arrayList);
        void setOnclick(int position);
        void setMarqueeClick(int position);
        void setGridClick(int position);
        void setGridClickThird(int position);
        void setGridClickFour(int position);
        void setNewsList2Click(int position, String url);
        void setNewsList5Click(int position , String url);
    }

    //Presenter控制器
    interface Presenter extends BasePresenter {
        void setActivity(MainActivity activity);
        //初始化
        DelegateAdapter initRecyclerView(RecyclerView recyclerView);
        BaseDelegateAdapter initBannerAdapter();
        BaseDelegateAdapter initGvMenu();
        BaseDelegateAdapter initMarqueeView();
        BaseDelegateAdapter initTitle(String title);
        BaseDelegateAdapter initList1();
        BaseDelegateAdapter initList2();
    }

}

contract中需要做的事:

1>:寫一個 View接口用于繼承BaseView甸祭,View就指的是Activity、Fragment褥影,里邊寫的方法就是Activity或者Fragment中所需要實現(xiàn)的方法名字池户;

2>:寫一個 Presenter接口繼承BasePresenter控制器,里邊的方法就是具體的聯(lián)網(wǎng)請求的方法凡怎;

3.2:自己定義一個 HomeFragmentPresenter校焦,只實現(xiàn) HomeFrgmentContract.Presenter,然后復(fù)寫所有的方法栅贴,而不實現(xiàn)HomeFragmentContract.View斟湃,目的是讓Activity或者Fragment實現(xiàn),這里就是讓HomeFragment實現(xiàn)HomeFragmentContract.View檐薯,然后實現(xiàn)具體方法:

1>:HomeFrgmentContract中的View下邊的方法凝赛,是讓Activity、Fragment中回調(diào)的方法坛缕;

2>:HomeFragmentContract中的 Presenter下邊的方法墓猎,是在HomeFragmentPresenter中實現(xiàn)的方法,然后把具體的聯(lián)網(wǎng)請求的數(shù)據(jù)都寫到Presenter下邊的方法赚楚,只需要返回數(shù)據(jù)的結(jié)果給Activity或者Fragment就可以毙沾;
具體代碼如下:

/**
 * Email: 2185134304@qq.com
 * Created by JackChen 2018/4/8 17:37
 * Version 1.0
 * Params:
 * Description:  HomeFragmentPresenter 
*/
public class HomeFragmentPresenter implements HomeFragmentContract.Presenter {

    private HomeFragmentContract.View mView;
    private CompositeSubscription mSubscriptions;
    private MainActivity activity;

    public HomeFragmentPresenter(HomeFragmentContract.View androidView) {
        this.mView = androidView;
        mSubscriptions = new CompositeSubscription();
    }

    @Override
    public void subscribe() {

    }


    @Override
    public void unSubscribe() {
        mSubscriptions.clear();
    }


    @Override
    public void setActivity(MainActivity activity) {
        this.activity = activity;
    }


    @Override
    public DelegateAdapter initRecyclerView(RecyclerView recyclerView) {
        //初始化
        //創(chuàng)建VirtualLayoutManager對象
        VirtualLayoutManager layoutManager = new VirtualLayoutManager(activity);
        recyclerView.setLayoutManager(layoutManager);

        //設(shè)置回收復(fù)用池大小,(如果一屏內(nèi)相同類型的 View 個數(shù)比較多宠页,需要設(shè)置一個合適的大小左胞,防止來回滾動時重新創(chuàng)建 View)
        RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
        recyclerView.setRecycledViewPool(viewPool);
        viewPool.setMaxRecycledViews(0, 20);

        //設(shè)置適配器
        DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager, true);
        recyclerView.setAdapter(delegateAdapter);
        return delegateAdapter;
    }


    /**
     * 設(shè)置輪播圖數(shù)據(jù)
     * @return
     */
    @Override
    public BaseDelegateAdapter initBannerAdapter() {
        final List<Object> arrayList = new ArrayList<>();
        arrayList.add("http://bpic.wotucdn.com/11/66/23/55bOOOPIC3c_1024.jpg!/fw/780/quality/90/unsharp/true/compress/true/watermark/url/L2xvZ28ud2F0ZXIudjIucG5n/repeat/true");
        arrayList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505470629546&di=194a9a92bfcb7754c5e4d19ff1515355&imgtype=0&src=http%3A%2F%2Fpics.jiancai.com%2Fimgextra%2Fimg01%2F656928666%2Fi1%2FT2_IffXdxaXXXXXXXX_%2521%2521656928666.jpg");
        //banner
        return new BaseDelegateAdapter(activity, new LinearLayoutHelper(), R.layout.view_vlayout_banner, 1, Constant.viewType.typeBanner) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, int position) {
                super.onBindViewHolder(holder, position);
                // 綁定數(shù)據(jù)
                BannerView mBanner = holder.getView(R.id.banner);
                mView.setBanner(mBanner,arrayList);
            }
        };
    }


    /**
     * 設(shè)置8宮格數(shù)據(jù)
     */
    @Override
    public BaseDelegateAdapter initGvMenu() {
        //menu
        // 在構(gòu)造函數(shù)設(shè)置每行的網(wǎng)格個數(shù)
        final TypedArray proPic = activity.getResources().obtainTypedArray(R.array.find_gv_image);
        final String[] proName = activity.getResources().getStringArray(R.array.find_gv_title);
        final List<Integer> images = new ArrayList<>();
        for(int a=0 ; a<proName.length ; a++){
            images.add(proPic.getResourceId(a,R.mipmap.ic_data_picture));
        }
        proPic.recycle();
        GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(4);
        gridLayoutHelper.setPadding(0, 16, 0, 16);
        gridLayoutHelper.setVGap(16);   // 控制子元素之間的垂直間距
        gridLayoutHelper.setHGap(0);    // 控制子元素之間的水平間距
        gridLayoutHelper.setBgColor(Color.WHITE);
        return new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.item_vp_grid_iv, 8, Constant.viewType.typeGv) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
                super.onBindViewHolder(holder, position);
                holder.setText(R.id.tv_new_seed_title, proName[position]);
                holder.setImageResource(R.id.iv_new_seed_ic, images.get(position));
                holder.getView(R.id.ll_new_seed_item).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mView.setOnclick(position);
                    }
                });
            }
        };
    }


    /**
     * 設(shè)置精選垂直滾動的數(shù)據(jù)
     */
    @Override
    public BaseDelegateAdapter initMarqueeView() {
        LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
        return new BaseDelegateAdapter(activity,linearLayoutHelper , R.layout.view_vlayout_marquee, 1, Constant.viewType.typeMarquee) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, int position) {
                super.onBindViewHolder(holder, position);
                MarqueeView marqueeView = holder.getView(R.id.marqueeView);

                List<String> info1 = new ArrayList<>();
                info1.add("1.銀卡惠,一款大家都在使用的產(chǎn)品举户,出售各種優(yōu)惠劵烤宙!");
                info1.add("2.歡迎入住銀卡惠app,讓您財運亨通俭嘁!");
                marqueeView.startWithList(info1);
                // 在代碼里設(shè)置自己的動畫
                marqueeView.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
                    @Override
                    public void onItemClick(int position, TextView textView) {
                        mView.setMarqueeClick(position);
                    }
                });
            }
        };
    }

    @Override
    public BaseDelegateAdapter initTitle(final String title) {
        return new BaseDelegateAdapter(activity, new LinearLayoutHelper(), R.layout.view_vlayout_title, 1, Constant.viewType.typeTitle) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, int position) {
                super.onBindViewHolder(holder, position);
                holder.setText(R.id.tv_title, title);
            }
        };
    }

    @Override
    public BaseDelegateAdapter initList1() {
//        //item1 gird
//        final TypedArray list1_image = activity.getResources().obtainTypedArray(R.array.find_list1_image);
//        final String[] list1_title = activity.getResources().getStringArray(R.array.find_list1_title);
//        final List<Integer> images = new ArrayList<>();
//        for(int a=0 ; a<list1_title.length ; a++){
//            images.add(list1_image.getResourceId(a,R.mipmap.ic_data_picture));
//        }
//        list1_image.recycle();
//        GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(4);
//        gridLayoutHelper.setMargin(0, 0, 0, 0);
//        gridLayoutHelper.setPadding(0, 20, 0, 10);
//        gridLayoutHelper.setVGap(10);// 控制子元素之間的垂直間距
//        gridLayoutHelper.setHGap(0);// 控制子元素之間的水平間距
//        gridLayoutHelper.setWeights(new float[]{25, 25, 25 , 25});
//        gridLayoutHelper.setBgColor(Color.WHITE);
//        //gridLayoutHelper.setAutoExpand(true);//是否自動填充空白區(qū)域
//        return new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_grid, 8, Constant.viewType.typeGvSecond) {
//            @Override
//            public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
//                super.onBindViewHolder(holder, position);
//                holder.setText(R.id.tv_title, list1_title[position]);
//                ImageView iv = holder.getView(R.id.iv_image);
//                ImageUtils.loadImgByPicasso(activity, images.get(position), iv);
//                holder.getItemView().setOnClickListener(new View.OnClickListener() {
//                    @Override
//                    public void onClick(View v) {
//                        mView.setGridClick(position);
//                    }
//                });
//            }
//        };
        return null ;
    }

    @Override
    public BaseDelegateAdapter initList2() {
        LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
        linearLayoutHelper.setAspectRatio(4.0f);
        linearLayoutHelper.setDividerHeight(5);
        linearLayoutHelper.setMargin(0, 0, 0, 0);
        linearLayoutHelper.setPadding(0, 0, 0, 10);
        //linearLayoutHelper.setBgColor(0xFFF5A623);
        return new BaseDelegateAdapter(activity, linearLayoutHelper, R.layout.item_tx_news_list, 3, Constant.viewType.typeNews) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, final int position) {
                super.onBindViewHolder(holder, position);
                if (Constant.findNews != null && Constant.findNews.size() > 0) {
                    HomeBlogEntity model = Constant.findNews.get(position);
                    holder.setText(R.id.tv_title, model.getTitle());
                    ImageView imageView = holder.getView(R.id.iv_logo);
                    ImageUtils.loadImgByPicassoError(activity, model.getImageUrl(), R.mipmap.image_default, imageView);
                    holder.setText(R.id.tv_time, model.getTime());
                    holder.getItemView().setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            mView.setNewsList2Click(position,Constant.findNews.get(position).getUrl());
                        }
                    });
                } else {
                    ImageView imageView = holder.getView(R.id.iv_logo);
                    holder.setText(R.id.tv_title, "標(biāo)題 ");
                    imageView.setImageResource(R.mipmap.image_default);
                    holder.setText(R.id.tv_time, "時間");
                }
            }
        };
    }


    /**
     * 豆瓣電影
     */
    @Override
    public BaseDelegateAdapter initList3() {
        final TypedArray list3_image = activity.getResources().obtainTypedArray(R.array.find_list3_image);
        final String[] list3_title = activity.getResources().getStringArray(R.array.find_list3_title);
        final String[] list3_title_price = activity.getResources().getStringArray(R.array.find_list3_title_price);
        final List<Integer> images = new ArrayList<>();
        for(int a=0 ; a<list3_title.length ; a++){
            images.add(list3_image.getResourceId(a,R.mipmap.ic_data_picture));
        }
        list3_image.recycle();
        GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(3);
        gridLayoutHelper.setMargin(20, 0, 20, 0);
        gridLayoutHelper.setPadding(0, 20, 0, 10);
        gridLayoutHelper.setBgColor(Color.WHITE);
        //gridLayoutHelper.setAspectRatio(1.5f);  // 設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

        // gridLayoutHelper特有屬性(下面會詳細(xì)說明)
        //設(shè)置每行中 每個網(wǎng)格寬度 占 每行總寬度 的比例
        gridLayoutHelper.setWeights(new float[]{30, 40, 30});
        gridLayoutHelper.setVGap(0);// 控制子元素之間的垂直間距
        gridLayoutHelper.setHGap(5);// 控制子元素之間的水平間距
        //gridLayoutHelper.setAutoExpand(false);//是否自動填充空白區(qū)域
        //gridLayoutHelper.setSpanCount(6);   // 設(shè)置每行多少個網(wǎng)格
        return new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_hor, 3, Constant.viewType.typeList) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
                super.onBindViewHolder(holder, position);
                holder.setText(R.id.tv_title, list3_title[position]);
                holder.setText(R.id.tv_price , list3_title_price[position]) ;
                ImageView iv = holder.getView(R.id.iv_image);
                ImageUtils.loadImgByPicasso(activity, images.get(position), iv);
                holder.getItemView().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 豆瓣的3個圖片的點擊事件
                        mView.setGridClickThird(position);
                    }
                });
            }
        };
//        return null ;
    }


    /**
     * 為您精選
     */
    @Override
    public BaseDelegateAdapter initList4() {
        final TypedArray list4_image = activity.getResources().obtainTypedArray(R.array.find_list4_image);
        final String[] list4_title = activity.getResources().getStringArray(R.array.find_list4_title);
        final String[] list4_title_price = activity.getResources().getStringArray(R.array.find_list4_title_price);
        final List<Integer> images = new ArrayList<>();
        for(int a=0 ; a<list4_title.length ; a++){
            images.add(list4_image.getResourceId(a,R.mipmap.ic_data_picture));
        }
        list4_image.recycle();
        OnePlusNLayoutHelper onePlusNLayoutHelper = new OnePlusNLayoutHelper();
        //noinspection deprecation
        onePlusNLayoutHelper.setBgColor(activity.getResources().getColor(R.color.colorWhite));
        //onePlusNLayoutHelper.setAspectRatio(2.0f);
        //onePlusNLayoutHelper.setColWeights(new float[]{40f});
        //onePlusNLayoutHelper.setRowWeight(30f);
        onePlusNLayoutHelper.setMargin(0, 0, 0, 0);
        onePlusNLayoutHelper.setPadding(10, 20, 10, 10);
        return new BaseDelegateAdapter(activity, onePlusNLayoutHelper, R.layout.view_vlayout_plus, 3, Constant.viewType.typePlus) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
                super.onBindViewHolder(holder, position);
                if (position == 0) {
                    holder.getView(R.id.ll_first).setVisibility(View.VISIBLE);
                    holder.getView(R.id.ll_second).setVisibility(View.GONE);
                    holder.setText(R.id.tv_title, list4_title[position]);
                    holder.setText(R.id.tv_price, list4_title_price[position]);
                    holder.setImageResource(R.id.iv_image, images.get(position));
                } else {
                    holder.getView(R.id.ll_first).setVisibility(View.GONE);
                    holder.getView(R.id.ll_second).setVisibility(View.VISIBLE);
                    holder.setText(R.id.tv_title2, list4_title[position]);
                    holder.setText(R.id.tv_price_2, list4_title_price[position]);
                    holder.setImageResource(R.id.iv_image2, images.get(position));
                }
                holder.getItemView().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mView.setGridClickFour(position);
                    }
                });
            }
        };
    }


    /**
     * 優(yōu)質(zhì)新聞
     */
    @Override
    public BaseDelegateAdapter initList5() {
        LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
        linearLayoutHelper.setAspectRatio(4.0f);
        linearLayoutHelper.setDividerHeight(5);
        linearLayoutHelper.setMargin(0, 0, 0, 0);
        linearLayoutHelper.setPadding(0, 0, 0, 10);
        // 參數(shù)3:布局文件 參數(shù)4:一頁顯示的個數(shù) 參數(shù)5:int typeFooter = 9 //底部
        return new BaseDelegateAdapter(activity, linearLayoutHelper, R.layout.view_vlayout_news, 10, Constant.viewType.typeFooter) {
            @Override
            public void onBindViewHolder(BaseViewHolder holder, final int position) {
                super.onBindViewHolder(holder, position);
                // 如果底部新聞?wù)埱蟮臄?shù)據(jù)大于0躺枕,就執(zhí)行if;否則執(zhí)行else
                if (Constant.findBottomNews != null && Constant.findBottomNews.size() > 0) {
                    Log.e("TAG" , "if語句") ;
//                    HomeBlogEntity model = Constant.findBottomNews.get(position);
//                    holder.setText(R.id.tv_title, model.getTitle());
//                    ImageView imageView = holder.getView(R.id.iv_logo);
//                    ImageUtils.loadImgByPicassoError(activity, model.getImageUrl(), R.mipmap.image_default, imageView);
//                    holder.setText(R.id.tv_time, model.getTime());
//                    holder.getItemView().setOnClickListener(new View.OnClickListener() {
//                        @Override
//                        public void onClick(View v) {
//                            mView.setNewsList5Click(position,Constant.findBottomNews.get(position).getUrl());
//                        }
//                    });
                } else {
//                    Log.e("TAG" , "else語句") ;
                    ImageView imageView = holder.getView(R.id.iv_logo);
                    holder.setText(R.id.tv_title, "官方自營IPhone9 Plus ");
                    imageView.setImageResource(R.mipmap.test_iphone);
                    holder.setText(R.id.tv_time, "¥129999");
                    holder.getItemView().setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {   // Constant.findBottomNews.get(position).getUrl()
                            mView.setNewsList5Click(position,"");
                        }
                    });
                }
            }
        };
    }

}

3.3:model:用于存放BannerView輪播圖的javabean數(shù)據(jù);

3.4:view:定義fragment包拐云,創(chuàng)建HomeFragment然后實現(xiàn)HomeFragmentContract.View罢猪,然后實現(xiàn)里邊的方法;

1>:直接在HomeFragment中創(chuàng)建presenter對象叉瘩,然后調(diào)用HomeFragmentPresenter中對應(yīng)的方法來獲取返回的數(shù)據(jù)膳帕,從而就可以在HomeFragment中利用返回的數(shù)據(jù)來填充BannerView頁面的數(shù)據(jù)和其他控件的數(shù)據(jù);
代碼如下:

/**
 * Email: 2185134304@qq.com
 * Created by JackChen 2018/4/9 10:06
 * Version 1.0
 * Params:
 * Description:
*/

public class HomeFragment extends BaseFragment implements View.OnClickListener , HomeFragmentContract.View {

    private MainActivity activity;
    private HomeFragmentContract.Presenter presenter = new HomeFragmentPresenter(this);

    @Bind(R.id.tv_title)
    TextView tvTitle;
    @Bind(R.id.recyclerView)
    RecyclerView recyclerView;

    /** 存放各個模塊的適配器*/
    private List<DelegateAdapter.Adapter> mAdapters;
    private BannerView mBanner;
//    private Realm realm;

    private static boolean isFirstEnter = true;
    private RefreshLayout refreshLayout;
    private Intent intent;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        activity = (MainActivity) context;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if(activity!=null){
            activity = null;
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if(mBanner!=null){
            mBanner.pause();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(mBanner!=null){
            mBanner.resume();
        }
    }



    @Override
    public void onDestroy() {
        super.onDestroy();
        restore();
        presenter.unSubscribe();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter.subscribe();
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public int getContentView() {
        install();
        return R.layout.fragment_example_assign_default;  // base_recycler_view
    }

    @Override
    public void initView() {
        refreshLayout = (RefreshLayout) activity.findViewById(R.id.refreshLayout);
        mAdapters = new LinkedList<>();
//        initRealm();
        presenter.setActivity(activity);
        initRecyclerView();
        tvTitle.setText("首頁");
//        activity.showToolBar();
    }



    private void initRecyclerView() {
      
    }

    /**
     * 設(shè)置輪播圖數(shù)據(jù)
     */
    @Override
    public void setBanner(BannerView mBanner, List<Object> arrayList) {
        this.mBanner = mBanner;
        mBanner.setHintGravity(2);
        mBanner.setAnimationDuration(1000);
        mBanner.setPlayDelay(2000);
        mBanner.setHintPadding(0,0,0, SizeUtil.dip2px(activity,10));

        mBanner.setAdapter(new BaseBannerPagerAdapter(activity, arrayList));
    }


    @Override
    public void initListener() {

    }

    @Override
    public void initData() {
    }

    @Override
    public void setOnclick(int position) {

    }

    @Override
    public void setMarqueeClick(int position) {

    }

    @Override
    public void setGridClick(int position) {

    }

    @Override
    public void setGridClickThird(int position) {
   
        }
    }


    /**
     * 為您精選
     */
    @Override
    public void setGridClickFour(int position) {
  
        }
    }

    @Override
    public void setNewsList2Click(int position, String url) {

    }

    }
}

4. 總結(jié)


上邊啰啰嗦嗦這么多房揭,大家如果不是很清楚或者不是很理解的备闲,也沒有關(guān)系,可以不用看上邊的捅暴,只需要把我下邊的總結(jié)看懂就ok恬砂,照樣也可以很好的把MVP用在項目中。

1>:整個項目涉及到Activity或者Fragment包是ui包蓬痒,然后在ui包下邊創(chuàng)建底部所有的fragment包泻骤,如home、cart梧奢、my狱掂,表示首頁、購物車亲轨、我的趋惨;

2>:全局創(chuàng)建BaseView、BasePresenter惦蚊;

3>:然后針對于home首頁器虾,在里邊創(chuàng)建4個包,分別是contract蹦锋、model兆沙、view、presenter莉掂;

對于contract葛圃,創(chuàng)建HomeFragmentContract接口,需要做兩件事:

第一:定義View接口憎妙,繼承BaseView库正,然后定義一些方法,View下的方法作用是給Activity或者Fragment回調(diào)的厘唾;

第二:定義Presenter接口诀诊,繼承BasePresenter,然后定義一些方法阅嘶,Presenter下的方法作用是寫具體進(jìn)行聯(lián)網(wǎng)請求的代碼,來獲取網(wǎng)絡(luò)返回的數(shù)據(jù);

4>:定義HomeFragmentPresenter讯柔,實現(xiàn)HomeFragmentContract.Presenter抡蛙,然后實現(xiàn)里邊的方法,把每一個需要填充數(shù)據(jù)的控件魂迄,所需要調(diào)用的接口的聯(lián)網(wǎng)請求都寫到對應(yīng)的方法中粗截,然后調(diào)用V層的回調(diào)方法,用于返回數(shù)據(jù)給Activity或者Fragment捣炬;

5>:讓HomeFragment實現(xiàn) HomeFragmentContract.View熊昌,然后實現(xiàn)里邊的方法,即就是V層中的方法湿酸,V層中的方法其實在P層中已經(jīng)獲取到了數(shù)據(jù)婿屹,這里只是通過回調(diào)接口把數(shù)據(jù)回傳給Activity或者Fragment的即可,然后在HomeFragment中直接獲取到數(shù)據(jù)后推溃,就可以給所需要的控件去填充數(shù)據(jù)就ok昂利;

5. 注意:


上邊自己只是舉了一個具體的應(yīng)用場景,我要說的是其他的所有頁面铁坎,不管是其他的Fragment或者是點擊任何一個Fragment中的按鈕或者點擊任何地方的按鈕進(jìn)入某個Activity蜂奸,都是可以使用上邊的方式來處理數(shù)據(jù),也就是說每一個小模塊都需要創(chuàng)建對應(yīng)4個包硬萍,分別是contract扩所、model、view朴乖、presenter祖屏,然后在對應(yīng)的包下創(chuàng)建對應(yīng)的類,然后做對應(yīng)的事情就ok寒砖。

以上就是自己在項目中MVP具體的使用方法赐劣,如果還不是特別清楚的,可以給我發(fā)私信哩都,或者加我qq都是可以的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魁兼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漠嵌,更是在濱河造成了極大的恐慌咐汞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儒鹿,死亡現(xiàn)場離奇詭異化撕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)约炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門植阴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟹瘾,“玉大人,你說我怎么就攤上這事掠手『镀樱” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵喷鸽,是天一觀的道長众雷。 經(jīng)常有香客問我,道長做祝,這世上最難降的妖魔是什么砾省? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮混槐,結(jié)果婚禮上编兄,老公的妹妹穿的比我還像新娘。我一直安慰自己纵隔,他們只是感情好翻诉,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捌刮,像睡著了一般碰煌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绅作,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天芦圾,我揣著相機(jī)與錄音,去河邊找鬼俄认。 笑死个少,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眯杏。 我是一名探鬼主播夜焦,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岂贩!你這毒婦竟也來了茫经?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萎津,失蹤者是張志新(化名)和其女友劉穎卸伞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锉屈,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡荤傲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颈渊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遂黍。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡终佛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妓湘,到底是詐尸還是另有隱情查蓉,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布榜贴,位于F島的核電站,受9級特大地震影響妹田,放射性物質(zhì)發(fā)生泄漏唬党。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一鬼佣、第九天 我趴在偏房一處隱蔽的房頂上張望驶拱。 院中可真熱鬧,春花似錦晶衷、人聲如沸蓝纲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽税迷。三九已至,卻和暖如春锹漱,著一層夾襖步出監(jiān)牢的瞬間箭养,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工哥牍, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留毕泌,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓嗅辣,卻偏偏與公主長得像撼泛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澡谭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容