安卓开发之架构理解(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);
                }
            });
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用android studio 运行,下面是一个简单的文档,这个代码是一个demo 一、Activity的使用 1、SNActivity 框架最基本的activity,可调用$(SNManager)进行操作activity,具体用法请参考文档或代码 2、SNNavigationSlidingActivity 包含SNActivity的功能,继承于com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity 支持导航条和左滑视图的Activity 加载导航条: loadNavBar(int height,int background_color_id) loadNavBarResId(int height_id,int background_id) 加载左侧视图: /** * load left view * @param left_id left layout id * @param offset_value offset value * @param shadow_width_value shadow width value * @param shadow_drawable_id shadow drawable style * @param fade fade value */ loadLeft(int left_id, int offset_value, int shadow_width_value, int shadow_drawable_id, float fade) /** * load left view * @param left_id left layout id * @param offset_id offset id * @param shadow_width_id shadow width id * @param shadow_drawable_id shadow drawable id * @param fade fade value */ loadLeftResId(int left_id, int offset_id, int shadow_width_id, int shadow_drawable_id, float fade) 二、SNElement的使用 View的伪装对象,支持所有View的功能,详细功能可参考文档或代码 手动伪装:$.create $.id $.findView 注入伪装:$.setContent(view class or layout id,inject class); 获取原型:elem.toView(); 三、注入 1、视图注入 A、创建注入类,属性名称必须和layout中的id对应,如果不对应请加入标签@SNInjectView class DemoInject{ @SNInjectView(id=R.id.tvTest) public SNElement test; } B、实例化注入对象 DemoInject di=new DemoInject(); C、调用$.inject或者$.setContent注入 $.inject(di); D、注入成功后即可调用对象 String text=di.test.text(); 2、依赖注入 A、需要绑定注入对象,建议写到Application中的onCreate SNBindInjectManager.instance().bind(ITest.class, Test.class); B、与视图注入不同的是属性必须添加标签@SNIOC,注入的对象(Test)必须包含只有一个SNManager参数的构造函数,且必须实现注入者 public class Test implements ITest{ SNManager $; public Test(SNManager _$){ this.$=_$; }; } class DemoInject{ @SNIOC public ITest test; } C、调用$.inject或者$.setContent注入 同视图注入 D、注入成功后即可调用对象 di.test.xxx(); 四、fragment的使用 1、SNFragment 2、SNLazyFragment 五、控件的使用 1、SNFragmentScrollable 2、SNPercentLinearLayout、SNPercentRelativeLayout 3、SNScrollable 4、SNSlipNavigation 5、XList 6、slidingtab
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值