//首先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);
}