【從 0 開始開發(fā)一款直播 APP】5.2 MVP 之 Fragment 交互實現滑動導航

本文為菜鳥窩作者蔣志碧的連載《谅玻“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP,如何完整的實現一個類"騰訊直播"的商業(yè)化項目
視頻地址:http://www.cniao5.com/course/10121


【從 0 開始開發(fā)一款直播 APP】5.1 MVP 完全解析 -- 實現直播登錄
【從 0 開始開發(fā)一款直播 APP】5.2 MVP 之 Fragment 交互實現滑動導航
【從 0 開始開發(fā)一款直播 APP】5.3 MVC 完全解析 -- 實現直播登錄
【從 0 開始開發(fā)一款直播 APP】5.4 MVC 之 Fragment 交互實現滑動導航


上一章講了 MVP 實現登錄功能袁滥,這一章講 MVP 實現主頁面展示盖桥,前面已經實現了這個功能,現在結合 MVP 來講解题翻。

MVP 之 Fragment 交互實現滑動導航

Presenter

一揩徊、MainPresenter 對應于 MainActivity

1、定義 BasePresenter 接口嵌赠,主要方法是 start() — presenter 開始處理數據塑荒,綁定 Presenter 。 finish() — 處理銷毀工作姜挺,界面結束時調用齿税,取消綁定 Presenter 的方法。

2初家、定義 IMainPresenter 抽象類實現 BasePresenter 接口偎窘,定義登錄所需邏輯處理方法,與 IMainView 關聯溜在。

3陌知、定義 MainPresenter 繼承 IMainPresenter 抽象類,實現抽象方法以及處理邏輯掖肋。

二仆葡、LiveMainPresenter 對應于 LiveMainFragment

LiveMainPresenter 與 LiveMainFragment 關聯

View

一、MainActivity

1志笼、定義 BaseView 接口沿盅,將通用方法封裝到里面。

2纫溃、定義 IMainView 接口腰涧,繼承BaseView

3、MainActivity 實現 IMainView 及其抽象方法

二紊浩、LiveMainFragment

LiveMainFragment 與 MainActivity 關聯窖铡,LiveMainFragment 主要在 MainActivity 中顯示 FragmentTabHost 數據疗锐。

Model

看到上面運行效果圖中,數據就是圖片以及標題费彼,還有 Fragment 等滑臊,直接在 Presenter 定義。

看完類圖箍铲,下面開始創(chuàng)建 MVP 基本架構雇卷,下面是根據上面類圖創(chuàng)建的相關包以及接口和類,紅色矩形框中的是LiveMainFragment 以及 MainActivity 展示數據要用到的類颠猴,下面一一進行講解关划。

注意:本章講解是基于前面的一篇文章進行講解,不做過多的介紹芙粱。
具體細節(jié)查看:【從 0 開始開發(fā)一款直播 APP】2.2 高層封裝之 Fragment -- 滑動導航

MainActivity 的數據展示

Presenter 所有類實現

1祭玉、MainPresenter

public abstract class IMainPresenter implements BasePresenter{

    protected BaseView mBaseView;
    protected BaseActivity mContext;

    public IMainPresenter(BaseView baseView,BaseActivity context) {
        this.mBaseView = baseView;
        this.mContext = context;
    }

    //初始化 FragmentTabHost
    protected abstract void initFragment();
    //展示 Tab 選項卡
    protected abstract View getTabItemView(int i);
}

2、IMainPresenter

BasePresenter 和登錄中的功能一樣春畔,請查看前面一節(jié)內容脱货,MainPresenter 與 Model 關聯,這里的 Model 是 FragmentTabHost 實現的底部導航律姨。

public class MainPresenter extends IMainPresenter {

    private IMainView mIMainView;
    private FragmentTabHost mTabHost;
    private final Class mFragmentArray[] = {LiveMainFragment.class, PublishFragment.class, UserInfoFragment.class};
    private int mImageViewArray[] = {R.drawable.tab_live_selector, R.drawable.tab_pubish_selector, R.drawable.tab_my_selector};
    private String mTextViewArray[] = {"live", "publish", "mine"};

    public MainPresenter(IMainView mainView, BaseActivity context) {
        super(mainView,context);
        mIMainView = mainView;
    }

    @Override
    public void start() {
    }

    @Override
    public void finish() {
        if (mIMainView!=null){
            mIMainView = null;
        }
    }


    @Override
    public void initFragment() {
        mTabHost = mContext.obtainView(android.R.id.tabhost);
        mTabHost.setup(mContext, mContext.getSupportFragmentManager(), R.id.contentPanel);
        int fragmentCount = mFragmentArray.length;
        for (int i = 0; i < fragmentCount; i++) {
            TabHost.TabSpec tabSpec = mTabHost.newTabSpec(mTextViewArray[i]).setIndicator(getTabItemView(i));
            mTabHost.addTab(tabSpec, mFragmentArray[i], null);
            mTabHost.getTabWidget().setDividerDrawable(null);
        }
    }

    @Override
    protected View getTabItemView(int i) {
        View view;
        view = LayoutInflater.from(mContext).inflate(R.layout.tab_live, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.tab_icon);
        imageView.setImageResource(mImageViewArray[i]);
        return view;
    }

    @Override
    protected void checkCacheAndLogin() {
    }
}

View 的所有類實現

1振峻、IMainView

目前還沒有其它新增方法,后續(xù)慢慢添加

public interface IMainView extends BaseView {
}

2择份、MainActivity

MainActivity 與 MainPresenter 關聯扣孟,與原來的代碼相比,避免了與 Model 直接交互荣赶。

public class MainActivity extends BaseActivity implements IMainView {
    private MainPresenter mMainPresenter;

    @Override
    protected void setActionBar() {
    }

    @Override
    protected void setListener() {
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void initView() {
        mMainPresenter = new MainPresenter(this,this);
        mMainPresenter.initFragment();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    public void showLoading() {
    }

    @Override
    public void dismissLoading() {
    }

    @Override
    public void showMsg(String msg) {
    }

    @Override
    public void showMsg(int msgId) {
    }

    @Override
    public Context getContext() {
        return this;
    }

}

運行效果大概是這樣凤价。

上面的導航依然是基于 LiveMainFragment

LiveMainFragment 的數據展示

LiveMainPresenter

LiveMainPresenter 對應的 View 是 LiveMainFragment,LiveMainPresenter 與 Model 關聯拔创,避免 Model 直接與 View 交互

public class LiveMainPresenter {
    private BaseActivity mContext;
    //數據展示
    private ViewPager mViewPager;
    private PagerSlidingTabStrip mTabStrip;
    private ArrayList<String> mTitles;
    private ArrayList<Fragment> mFragments;

    public LiveMainPresenter(BaseActivity context) {
        this.mContext = context;
    }

    public FragmentStatePagerAdapter getAdapter() {
        return new PagerAdapter(mContext.getSupportFragmentManager(),mTitles,mFragments);
    }

    public void initViewPager(View rootView){
        mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
        mTabStrip = (PagerSlidingTabStrip) rootView.findViewById(R.id.pager_sliding_tab_strip);
        mTabStrip.setTextColorResource(R.color.white);
        mTabStrip.setIndicatorColorResource(R.color.white);
        mTabStrip.setDividerColor(Color.TRANSPARENT);
        mTabStrip.setTextSize(rootView.getResources().getDimensionPixelSize(R.dimen.h6));
        mTabStrip.setUnderlineHeight(1);
        mViewPager.setCurrentItem(0);
    }

    public void initViewPagerData(){
        mTitles = new ArrayList<>();
        mFragments = new ArrayList<>();
        mTitles.add("最新");
        mTitles.add("最熱");
        mTitles.add("達人");
        mTitles.add("活力");
        mTitles.add("英雄聯盟");
        mTitles.add("王者榮耀");
        for (String s:mTitles){
            Bundle bundle = new Bundle();
            bundle.putString("title",s);
            mFragments.add(LiveListFragment.newInstance(bundle));
        }
    }

    public void initAdapter(FragmentStatePagerAdapter adapter){
        mViewPager.setAdapter(adapter);
        mTabStrip.setViewPager(mViewPager);
    }
}

View — LiveMainFragment

LiveMainFragment 與 LiveMainPresenter 關聯利诺,調用其方法更新數據展示在界面上

public class LiveMainFragment extends BaseFragment implements View.OnClickListener {

    private LiveMainPresenter mLiveMainPresenter;

    @Override
    protected void initData() {
    }

    @Override
    protected void setListener() {
        obtainView(R.id.iv_search).setOnClickListener(this);
        obtainView(R.id.iv_message).setOnClickListener(this);
    }

    @Override
    protected void initView(View rootView) {
        mLiveMainPresenter = new LiveMainPresenter(mContext);
        mLiveMainPresenter.initViewPager(rootView);
        mLiveMainPresenter.initViewPagerData();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_live_main;
    }

    @Override
    public void onClick(View v) {
    }
}

運行效果



使用 MVP 架構對于大型項目的開發(fā)結構清晰,只要搞懂三者的關系剩燥,畫出大致類圖慢逾,就可以很輕松寫出代碼了。

140套Android優(yōu)秀開源項目源碼灭红,領取地址:http://mp.weixin.qq.com/s/afPGHqfdiApALZqHsXbw-A

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末侣滩,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子变擒,更是在濱河造成了極大的恐慌君珠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娇斑,死亡現場離奇詭異葛躏,居然都是意外死亡澈段,警方通過查閱死者的電腦和手機悠菜,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門舰攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悔醋,你說我怎么就攤上這事摩窃。” “怎么了芬骄?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵猾愿,是天一觀的道長。 經常有香客問我账阻,道長蒂秘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任淘太,我火速辦了婚禮姻僧,結果婚禮上,老公的妹妹穿的比我還像新娘蒲牧。我一直安慰自己撇贺,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布冰抢。 她就那樣靜靜地躺著松嘶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挎扰。 梳的紋絲不亂的頭發(fā)上翠订,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音遵倦,去河邊找鬼尽超。 笑死,一個胖子當著我的面吹牛骇吭,可吹牛的內容都是我干的橙弱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼燥狰,長吁一口氣:“原來是場噩夢啊……” “哼棘脐!你這毒婦竟也來了?” 一聲冷哼從身側響起龙致,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蛀缝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后目代,有當地人在樹林里發(fā)現了一具尸體屈梁,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡嗤练,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了在讶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞抬。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖构哺,靈堂內的尸體忽然破棺而出革答,到底是詐尸還是另有隱情,我是刑警寧澤曙强,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布残拐,位于F島的核電站,受9級特大地震影響碟嘴,放射性物質發(fā)生泄漏溪食。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一娜扇、第九天 我趴在偏房一處隱蔽的房頂上張望错沃。 院中可真熱鬧,春花似錦袱衷、人聲如沸捎废。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽登疗。三九已至,卻和暖如春嫌蚤,著一層夾襖步出監(jiān)牢的瞬間辐益,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工脱吱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留智政,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓箱蝠,卻偏偏與公主長得像续捂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宦搬,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容