導入依賴:
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布局