从Google推出官方MVP架构demo到现在大概有一年多的时间了,半年前大概在所有的Android技术社区都有提到MVP架构,现在关于MVP架构的话题似乎没有以前那么多了,可能是因为大家都已经能够熟练的使用MVP了。在这里先炒碗闲饭,提供了一个快速生成MVP模式的插件。地址
对应的model层
public interface ApiService { @GET("type/1/p/1") Observable<Bean> geturl(); }
//定义接
public interface IModel { void geturl(String url); }
继承接口
public class WLmodel implements IModel{ private OnFinish onFinish ; public interface OnFinish{ void OnFinishListener(List<Bean.DataBean> data); } public void setOnFinish(OnFinish onFinish) { this.onFinish = onFinish; } @Override public void geturl(String url) {
OkHttpClient mClient = new OkHttpClient.Builder() .addInterceptor(new LoggingInterceptor())//应用拦截器 //.addNetworkInterceptor(new LoggingInterceptor())//网络拦截器 .build();
Retrofit retrofit = new Retrofit.Builder().
baseUrl(url).addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); ApiService apiService = retrofit.create(ApiService.class); Observable<Bean> homes = apiService.geturl(); homes.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Bean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Bean bean) { List<Bean.DataBean> data = bean.getData(); onFinish.OnFinishListener(data); } }); } }
对应presenter层的东西
//Api
public class API { public static final String url = "http://api.expoon.com/AppNews/getNewsList/"; }
创建类
WLPresenter
public class WLPresenter implements WLmodel.OnFinish { private final IView wlview; private final WLmodel wLmodel; public WLPresenter(IView wlview) { this.wlview = wlview; this.wLmodel = new WLmodel() ; } public void getWL(String url){ wLmodel.setOnFinish(this); wLmodel.geturl(url); } @Override public void OnFinishListener(List<Bean.DataBean> list) { wlview.getNews(list); } }
view层
public interface IView { void getNews(List<Bean.DataBean> list); }
对应的适配器
- public class HomeAdaper extends RecyclerView.Adapter {
- Context context;
- List<News.DataBean> list;
- public HomeAdaper(Context context, List<News.DataBean> list) {
- this.context = context;
- this.list = list;
- }
- @Override
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
- context).inflate(R.layout.listview, parent,
- false));
- return holder;
- }
- @Override
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- MyViewHolder holder1 = (MyViewHolder) holder;
- holder1.tv.setText(list.get(position).getNews_title());
- holder1.draweeView1.setImageURI(list.get(position).getPic_url());
- //创建DraweeController
- DraweeController controller = Fresco.newDraweeControllerBuilder()
- //重试之后要加载的图片URI地址
- .setUri(list.get(position).getPic_url())
- //设置点击重试是否开启
- .setTapToRetryEnabled(true)
- //动画播放
- .setAutoPlayAnimations(true)
- //设置旧的Controller
- .setOldController(holder1.draweeView1.getController())
- //构建
- .build();
- //设置DraweeController
- holder1.draweeView1.setController(controller);
- }
- @Override
- public int getItemCount() {
- return list.size();
- }
- class MyViewHolder extends RecyclerView.ViewHolder {
- SimpleDraweeView draweeView1;
- TextView tv;
- public MyViewHolder(View view) {
- super(view);
- tv = (TextView) view.findViewById(R.id.tv);
- draweeView1 = (SimpleDraweeView) view.findViewById(R.id.img);
- }
- }
- }
7. 所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)
8. 源码地址
http://download.csdn.net/detail/knxw0001/7983807
对应的主页面解析数据和接口回调
public class MainActivity extends AppCompatActivity implements IView{ private ListView lv; private WLPresenter wlPresenter ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { lv = (ListView) findViewById(R.id.lv); wlPresenter = new WLPresenter(this) ; wlPresenter.getWL(API.url); } @Override public void getNews(List<Bean.DataBean> list) { MyAdapter ma = new MyAdapter(this ,list) ; lv.setAdapter(ma); } }
//下面就是相关的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.bwie.mvpwangluo.MainActivity"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </LinearLayout>
对应的listview布局解析的文字和图片 对用的
<?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"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
相关权限 重点 name 应用 Myapp
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <application
- android:name=".Myapp"
相关依赖
- compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
- testCompile 'junit:junit:4.12'
- compile 'com.squareup.retrofit2:retrofit:2.0.1'
- compile 'com.squareup.retrofit2:converter-gson:2.0.1'
- compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
- compile 'io.reactivex:rxandroid:1.1.0'
- compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
- compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
- compile 'com.google.code.gson:gson:2.8.2'
- compile 'com.android.support:recyclerview-v7:24.0.0'
- //静态图片
- compile 'com.facebook.fresco:fresco:0.12.0'
- // 支持 GIF 动图,需要添加
- compile 'com.facebook.fresco:animated-gif:0.12.0'
- compile 'com.android.support:design:23.4.0'