用到的依赖
compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.facebook.fresco:fresco:1.5.0' compile 'com.android.support:recyclerview-v7:26.1.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'io.reactivex:rxjava:1.1.1' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'导入封装好的retrofit
public class RetrofitUnitl { private Retrofit mRetrofit; private String baseUrl; OkHttpClient client; private static RetrofitUnitl mRetrofitManager; private RetrofitUnitl(String baseUrl,OkHttpClient client){ this.baseUrl=baseUrl; this.client=client; initRetrofit(); } public static synchronized RetrofitUnitl getInstance(String baseUrl, OkHttpClient client){ if (mRetrofitManager == null){ mRetrofitManager = new RetrofitUnitl(baseUrl,client); } return mRetrofitManager; } private void initRetrofit() { mRetrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(client) .build(); } public <T> T setCreate(Class<T> reqServer) { return mRetrofit.create(reqServer); } }然后是View层
public interface PracticeView { void Succes(PracticrBean practicrBean); void Datach(Exception e); }这是请求方式
public interface PracticeRequest { //https://www.zhaoapi.cn/ad/getAd @GET("ad/getAd") Observable<PracticrBean> get(); }Modle层的接口
public interface PracticeModle { void Succes(PracticrBean practicrBean); void Datach(Exception e); }Modle的实体类
public class PracticeModles { //自己定义一个请求的方法 public void getData(final PracticeModle practiceModle){ OkHttpClient ok = new OkHttpClient.Builder() .build(); RetrofitUnitl.getInstance("https://www.zhaoapi.cn/",ok) .setCreate(PracticeRequest.class) .get() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Subscriber<PracticrBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(PracticrBean practicrBean) { practiceModle.Succes(practicrBean); } }) ; } }Presenter层
public class PracticePresenter { WeakReference<PracticeView> weakReference; // PracticeView practiceView; PracticeModles practiceModles; public PracticePresenter(PracticeView practiceView) { datach(practiceView); this.practiceModles = new PracticeModles(); } //自己定义的方法 public void login(){ // 判断 // view.success(); //new LoginModelImpl.LoginModelCallBack() 用modle层的实体类莱调用实体类的接口 得到成功的方法 practiceModles.getData(new PracticeModle() { @Override public void Succes(PracticrBean practicrBean) { weakReference.get().Succes(practicrBean); } @Override public void Datach(Exception e) { weakReference.get().Datach(e); } }); } // 绑定 内存泄漏 public void datach(PracticeView view){ weakReference = new WeakReference(view); } //解绑 public void data(){ weakReference.clear(); } }App图片框架的初始化
public class MyAp extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
适配器
public class SuApdata extends RecyclerView.Adapter<SuApdata.ViewHolder> { Context context; PracticrBean practicrBean; public SuApdata(Context context, PracticrBean practicrBean) { this.context = context; this.practicrBean = practicrBean; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.apdata_layout, null); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.tv.setText(practicrBean.getData().get(position).getTitle()); Uri uri = Uri.parse(practicrBean.getData().get(position).getIcon()); DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(uri) .setAutoPlayAnimations(true) .build(); holder.sd.setController(controller); } @Override public int getItemCount() { return practicrBean.getData().size(); } public class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.sd) SimpleDraweeView sd; @BindView(R.id.tv) TextView tv; public ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }主Actiivity
public class MainActivity extends AppCompatActivity implements PracticeView { PracticePresenter presenter; @BindView(R.id.rv) RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); presenter = new PracticePresenter(this); presenter.login(); } @Override public void Succes(PracticrBean practicrBean) { //线性格式 布局管理器 LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); rv.setLayoutManager(manager); //适配器 SuApdata adapter = new SuApdata(MainActivity.this, practicrBean); rv.setAdapter(adapter); //绑定 } @Override public void Datach(Exception e) { } //内存泄漏 @Override public void onDestroy() { super.onDestroy(); //解绑 presenter.data(); } }
主布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.dailyexercise.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </LinearLayout>
适配器布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sd" android:layout_width="500dp" android:layout_height="100dp" /> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>