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
- mosby mvp类库使用
- 使用mosby框架 应用MVP模式实现邮件客户端
- Ted Mosby - 一个MVP框架的软件架构
- MVP框架 – Ted Mosby的软件架构
- MVP框架 – Ted Mosby的软件架构
- Ted Mosby - 一个MVP框架的软件架构
- MVP框架 – Ted Mosby的软件架构
- MVP框架 – Ted Mosby的软件架构
- MVP框架 – Ted Mosby的软件架构
- MVP框架 – Ted Mosby的软件架构
- android MVP框架 – Ted Mosby的软件架构
- 一个很屌的实现MVP架构的开源库Ted Mosby
- MVP基类使用介绍
- MVP使用
- Mvp使用
- 天气预报项目学习总结(- ButterKnife - Retrofit 2.0(okhttp) - Rxjava - Jackson - Ormlite - Mosby简单使用总结)
- 使用MVP+Retrofit+RxJava实现的的Android Demo (上)使用Nuclues库实现MVP
- 【Android MVP】实践与分析 2 ,使用父类与泛型实践MVP
- Codeforces Round #413 Div. 1 + Div. 2 B. T-shirt buying
- 一台机器连接上了打印机,怎么共享给其他人使用?
- Java线程的interruption总结
- CentOS配置网络仅主机模式
- A星寻路算法最简单理解
- mosby mvp类库使用
- Codeforces Round #413 Div. 1 + Div. 2 C. Fountains
- php数据类型转换运算
- [leetcode: Python]198.House Robber
- Jaxb annotation初步使用
- jquery动态添加节点使事件失效
- 织梦CMS如何仿站?织梦仿站教程
- CentOS Linux 7 安装 VirtualBox
- (转)Android App监听软键盘按键的三种方式