mosby mvp类库使用

来源:互联网 发布:死宅真恶心 知乎 编辑:程序博客网 时间:2024/06/05 07:41

//首先Gradle中引入Mvp框架
compile ‘com.hannesdorfmann.mosby:mvp:2.0.1’
compile ‘com.hannesdorfmann.mosby:viewstate:2.0.1’

  **//mainActivity中**public class MainActivity extends MvpActivity<LoginView,    LoginPresenter> implements LoginView { //继承MvpActivity实现view层接口   Button button;   private EditText edname;    private EditText edpassword;       @Override    protected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       setContentView(R.layout.activity_main);       button = (Button) findViewById(R.id.bu_login);       edname = (EditText) findViewById(R.id.name);       edpassword = (EditText) findViewById(R.id.password);       button.setOnClickListener(new View.OnClickListener() {           @Override           public void onClick(View view) {               login();//登陆           }       });    }       private void login() {       if (edname.getText().toString().equals("") || edpassword.getText().toString().equals("")) {           Toast.makeText(this, "用戶名或者密码不能为空", Toast.LENGTH_SHORT).show();           return;       }       //p层通知对应的model层处理登陆逻辑       getPresenter().login(edname.getText().toString(),  edpassword.getText().toString());           }       @NonNull    @Override   //创建对应的p层        public LoginPresenter createPresenter() {       return new LoginPresenter();           }       @Override    //view层的回调接口方法       public void loginSuccessed() {       Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();       Intent intent = new Intent(this, HomeActivity.class);       startActivity(intent);       }       @Override          public void failed() {       Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();    } }**//view层接口**public interface LoginView extends MvpView {    void loginSuccessed();    void failed();}//p层逻辑//继承MvpBasePresenterpublic class LoginPresenter extends MvpBasePresenter<LoginView> {    public void login(String name, String password) {        if (name.equals("") || password.equals("")) {            LoginView view = getView();            if (view == null) {//特别需要注意的是,在Presenter中引用View时,一定要判断是否非空,                // 因为这个View是WeakReference弱引用,不进行判断的话会产生空指针异常。这是这个框架不好的地方,需要多次重复判空。                view.failed();            }        }        //可能需要监听业务层回调接口方法,model回调接口        LonginListener listener = new LonginListener() {            @Override            public void successed() {                //回调view层接口                LoginView view = getView();                if(view!=null){                    view.loginSuccessed();                }            }            @Override            public void failed() {                LoginView view = getView();                if(view!=null){//必须判空                    view.failed();                }            }        };        //传递到业务层处理登陆逻辑        DaoUtil.login(name, password, listener);    }}**//model层回调接口**public interface LonginListener {    void successed();    void failed();}**//model层处理逻辑**public class DaoUtil {//简单示范数据    public static void getUser(List<User> list, HomeListener listener) {        try {            User user = new User();            user.setName("张三");            user.setSax("男");            user.save();            list.add(user);            User user1 = new User();            user1.setName("李四");            user1.setSax("女");            user1.save();            list.add(user1);            if(list.size()>0){                listener.succesd(list);            }else{                listener.failed();            }        }catch(Exception e){            listener.error(e,false);//配合下拉刷新控件使用        }    }    public static void  login(String name, String password, LonginListener listener) {        if (name.equals("张三") && password.equals("123")) {            listener.successed();//简单表示,回调给p层        }else{            listener.failed();        }    }}//第二种使用方法:此类库提供了一层封装好的p层和view接口层//继承MvpLceActivity,实现view接口方法public class HomeActivity extends MvpLceActivity<LinearLayout, List<User>, IHomeView, HomePresenter> implements IHomeView {    private ListView listView;    private HomeAdapter homeAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.homeactivity_layout);        listView = (ListView) findViewById(R.id.lv_home);        loadData(false);//是否下拉刷新    }    @Override    public void showContent() {        super.showContent();    }    @Override    protected String getErrorMessage(Throwable e, boolean pullToRefresh) {        return "加载错误,请重新加载";    }    @NonNull    @Override    public HomePresenter createPresenter() {        return new HomePresenter();    }    @Override    public void setData(List<User> data) {        homeAdapter = new HomeAdapter(this, data);        listView.setAdapter(homeAdapter);        homeAdapter.notifyDataSetChanged();        //homeAdapter.addAllList(data);    }    @Override    public void loadData(boolean pullToRefresh) {        getPresenter().getListData();    }}//p层 MvpBasePresenter继承基类MvpBasePresenterpublic class HomePresenter extends MvpBasePresenter<IHomeView> {public void getListData(){    HomeListener listener=new HomeListener() {        @Override        public void start() {            getView().showLoading(true);/attachView回调时获取接口view对象,获取view并回调对应的方法        }        @Override        public void succesd(List<User>list) {            if(isViewAttached()){                getView().setData(list);                //getView().showContent();            }        }        @Override        public void failed() {            getView().showLoading(false);            //getView().showError();        }        @Override        public void error(Throwable e, boolean b) {            getView().showError(e,b);        }        @Override        public void complite() {            getView().showLoading(false);        }    };    List<User> list=new ArrayList<User>();    DaoUtil.getUser(list,listener);}//model层回调接口public interface HomeListener {    void start();    void succesd(List<User>list);    void failed();    void error(Throwable e,boolean b);    void complite();}//view层接口定义//只需要继承MvpLceView即可 ,可自己加入所需要的接口方法//默认已经给我们定义好几个接口了  public void showLoading(boolean pullToRefresh);//显示加载进度  public void showContent();//显示内容  public void showError(Throwable e, boolean pullToRefresh);//错误信息  public void setData(M data);//设置数据  public void loadData(boolean pullToRefresh);//加载数据public interface IHomeView extends MvpLceView<List<User>> {//根据业务可以加入自己的接口方法}**//适配器简单 就不贴代码了** xml文件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <LinearLayout            android:id="@+id/contentView"//id命名必须这样            android:layout_width="match_parent"            android:layout_height="match_parent"            android:orientation="vertical">            <ListView                android:id="@+id/lv_home"                android:layout_width="match_parent"                android:layout_height="match_parent"                android:divider="@color/colorPrimary"                android:dividerHeight="1dp"></ListView>        </LinearLayout>        <ProgressBar            android:visibility="gone"            android:id="@+id/loadingView"//id固定            style="?android:attr/progressBarStyle"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center" />        <TextView            android:visibility="gone"            android:id="@+id/errorView"//id固定            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:text="加载数据失败"            android:textSize="30sp" />    </FrameLayout></LinearLayout>源码MvpLceActivity类中已经定义好了几个对应view的id了@CallSuper @Override public void onContentChanged() {    super.onContentChanged();    loadingView = findViewById(R.id.loadingView);    contentView = (CV) findViewById(R.id.contentView);    errorView = (TextView) findViewById(R.id.errorView);}
0 0
原创粉丝点击