RxJava2+MVP+Retrofit框架简单实现RecyclerView

来源:互联网 发布:怎么看淘宝注册的时间 编辑:程序博客网 时间:2024/05/17 18:00

导入依赖:

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布局

原创粉丝点击