当前位置: 首页 > 工具软件 > mosby > 使用案例 >

mosby mvp类库使用

逑阳泽
2023-12-01

//首先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层逻辑
//继承MvpBasePresenter
public 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继承基类MvpBasePresenter
public 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);
}
 类似资料: