1. 程式人生 > >安卓開發之架構理解(MVP)

安卓開發之架構理解(MVP)

學習自MVP架構

MVP的全稱為Model-View-Presenter,即模型-檢視-協調器(主持者)

  • Model:處理資料和業務邏輯等,如:資料庫的操作,資料的請求載入,資料運算,JavaBean;
  • View:顯示介面,展示結果等,一切與介面相關的,如:XML檔案,Activity,Fragment,Dialog
  • Presenter:協調Model和View模組工作,處理互動

#程式示例

在ListView上展示文字和圖片

  1. 主介面的佈局:一個ListView,
  2. 定義一個Girl 的Bean物件
  3. 定義一個普通的介面卡GirlAdapter,
  4. 自定義ListView中的Item的一個佈局檔案

##Model層
首先定義介面

public interface IGirlModel {
    void loadGirl(onGirlListener listener);//載入資料
    interface onGirlListener{//資料載入完成後的監聽回撥
        void onComplete(List<Girl> list);
    }
}

然後實現該介面

public class GirlModelImpl implements IGirlModel {
    @Override
    public void loadGirl(onGirlListener listener) {
        //載入資料
        List<Girl> list=new ArrayList<Girl>();
        list.add(new Girl(R.drawable.image1, "你是我的小蘋果image1"));
        list.add(new Girl(R.drawable.image2, "你是我的小蘋果image2"));
        list.add(new Girl(R.drawable.image3, "你是我的小蘋果image3"));
        list.add(new Girl(R.drawable.image4, "你是我的小蘋果image4"));
        list.add(new Girl(R.drawable.image5, "你是我的小蘋果image5"));
        list.add(new Girl(R.drawable.image6, "你是我的小蘋果image6"));
        list.add(new Girl(R.drawable.image7, "你是我的小蘋果image7"));
        list.add(new Girl(R.drawable.image8, "你是我的小蘋果image8"));
        //返回資料
        listener.onComplete(list);
    }
}

##View層

定義介面

/**
 * 檢視層介面,定義與檢視操作相關的介面
 */
public interface IGirlView {
    //載入的提示
    void showDialog();
    //顯示載入後的資料
    void showGirls(List<Girl>list);
}

實現介面

public class MainActivity extends Activity implements IGirlView {
    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView() {
        listView = (ListView) findViewById(R.id.listview);
    }
    @Override
    public void showDialog() {
        Toast.makeText(this, "正在載入資料中。。。", Toast.LENGTH_LONG).show();
    }
    @Override
    public void showGirls(List<Girl> list) {
        listView.setAdapter(new GirlAdapter(this, list));
    }
}

##Persenter層
用於資料與檢視的互動

public class GirlPresenter {
    // View 的引用
    IGirlView iGirlView;
    // Model的引用
    IGirlModel iGirlModel=new GirlModelImpl();
    public GirlPresenter(IGirlView iGirlView) {
        this.iGirlView = iGirlView;
    }
    public void feach() {
        if (iGirlModel != null && iGirlView != null) {
            // 顯示進度條
            iGirlView.showDialog();
            // 載入資料
            iGirlModel.loadGirl(new onGirlListener() {
                @Override
                public void onComplete(List<Girl> list) {
                    // 返回資料,顯示到View層
                    iGirlView.showGirls(list);
                }
            });
        }
    }
}