天天看點

RxJava2+MVP+Retrofit架構簡單實作RecyclerView

導入依賴:

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile "io.reactivex.rxjava2:rxjava:2.1.1"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'      

權限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>      
先封裝一個Retrofie      
public class RetrofitUtil {
    private static volatile RetrofitUtil instance;
    private final Retrofit retrofit;
    private final ApiServence servence;

    private RetrofitUtil(){
        retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl("固定接口")
                .build();
        servence = retrofit.create(ApiServence.class);
    }
    public static RetrofitUtil getInstance(){
        if(instance == null){
            synchronized (RetrofitUtil.class){
                if(null == instance){
                    instance = new RetrofitUtil();
                }
            }
        }
        return instance;
    }

    public ApiServence getServence(){
     return servence;
    }

    }
      
一個ApiServence接口進行拼接url
public interface ApiServence {
    @GET("getAddrs")
    Flowable<MessageBean<List<ShowBean>>>  getShow(@QueryMap Map<String,String> map);
}      

首先是M層:

接口:

public interface IModel {
   void getData(Map<String,String>map);
}      

M層執行個體實作接口:

public class MyModel implements IModel  {
   private MyPresenter presenter;
    public MyModel(MyPresenter presenter){
        this.presenter = presenter;
    }
    @Override
    public void getData(Map<String, String> map) {
        Flowable<MessageBean<List<ShowBean>>> show = RetrofitUtil.getInstance().getServence().getShow(map);
        presenter.getShow(show);
    }

}
      

然後是P層:

接口:

public interface BasePresenter {
    void getData(Map<String,String> map);
}      

P層執行個體實作接口:

public class MyPresenter implements BasePresenter {
    private DisposableSubscriber<MessageBean<List<ShowBean>>> disposableSubscriber;
    private MyView iv;
    public void attachView(MyView iv){
        this.iv = iv;
    }
    public void datchView(){
        if(iv != null){
            iv = null;
        }
    }
    @Override
    public void getData(Map<String, String> map) {
        IModel model = new MyModel(this);
        model.getData(map);
    }

    public void getShow(Flowable<MessageBean<List<ShowBean>>> flowable){
        disposableSubscriber = flowable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableSubscriber<MessageBean<List<ShowBean>>>() {
                    @Override
                    public void onNext(MessageBean<List<ShowBean>> listMessageBean) {
                            if(listMessageBean != null){
                                List<ShowBean> data = listMessageBean.getData();
                                if(data != null){
                                    iv.onSuccess(data);
                                }
                            }
                    }

                    @Override
                    public void onError(Throwable t) {
                       iv.onFailed(new Exception(t));
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}
      

最後是V層

接口:

public interface MyView {
    void onSuccess(Object o);
    void onFailed(Exception e);
}      

V層執行個體Activity實心接口:

public class MainActivity extends AppCompatActivity implements MyView{
    private RecyclerView rvShow;
    private ShowAdapter adapter;

    private MyPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rvShow = (RecyclerView) findViewById(R.id.rv_show);
        rvShow.setLayoutManager(new LinearLayoutManager(this));
        //拼接url
        Map<String,String> map = new HashMap<>();
        map.put("uid","71");
        presenter = new MyPresenter();
        presenter.getData(map);

        presenter.attachView(this);
    }

    @Override
    public void onSuccess(Object o) {
       if(o instanceof List){
           List<ShowBean> list = (List<ShowBean>) o;
           adapter = new ShowAdapter(MainActivity.this,list);
           rvShow.setAdapter(adapter);
           adapter.notifyDataSetChanged();
       }
    }

    @Override
    public void onFailed(Exception e) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(presenter != null){
            presenter.datchView();
        }
    }
}
      

當然,既然是用RecyclerView,不要忘了擴充卡:

public class ShowAdapter extends RecyclerView.Adapter<ShowAdapter.MyViewHolder> {
    private Context context;
    private List<ShowBean> list;

    public ShowAdapter(Context context, List<ShowBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(context, R.layout.layout_zi, null);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
       holder.txtShow.setText(list.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView txtShow;
        public MyViewHolder(View itemView) {
            super(itemView);
            txtShow = itemView.findViewById(R.id.txt_show);
        }
    }
}
      

這樣是實作了一個簡單的RecyclerView布局