一、在项目build的文件中添加(最外面)
ext {
// Sdk and tools
minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'
//support版本
supportVersion = '27.1.0'
constraintLayout = '1.0.2'
junit = '4.12'
testRunner = '1.0.1'
espressoCore = '3.0.1'
interceptor = "3.11.0"
retrofit = '2.3.0'
converterGson = '2.3.0'
rxandroid = '1.2.1'
rxjava = '1.3.0'
rxbus = '1.0.6'
adapterRxjava = '2.0.2'
}
二、在module中添加依赖
implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofit"
implementation "com.squareup.retrofit2:converter-gson:$rootProject.converterGson"
implementation "io.reactivex:rxandroid:$rootProject.rxandroid"
implementation "io.reactivex:rxjava:$rootProject.rxjava"
implementation "com.hwangjr.rxbus:rxbus:$rootProject.rxbus"
implementation "com.squareup.retrofit2:adapter-rxjava:$rootProject.adapterRxjava"
implementation 'com.android.support:recyclerview-v7:28.0.0'
//日志拦截器
implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.interceptor"
implementation 'com.github.bumptech.glide:glide:4.9.0'
三、添加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
四、代码实现
接口类
public class Contacts {
public static final String BASE_URL="http://www.xieast.com/api/";
public static final String DATA="news/news.php?page=";
}
Api接口
public interface MyApiService {
@GET
Observable<ResponseBody> get(@Url String murl, @HeaderMap HashMap<String, Object> headermap, @QueryMap HashMap<String, Object> map);
}
网络请求类
public class RetrofitUtils {
private MyApiService myApiService;
private RetrofitUtils() {
//日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//设置日志拦截器的等级
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(20, TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//当网络请求失败的时候,等到网络正常自动加载
.retryOnConnectionFailure(true).build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(Contacts.BASE_URL)
.client(okHttpClient)
.build();
myApiService = retrofit.create(MyApiService.class);
}
//静态内部类单例模式
public static RetrofitUtils getInstance() {
return RetroHolder.retro;
}
private static class RetroHolder {
private static final RetrofitUtils retro = new RetrofitUtils();
}
//get请求
public void get(String url, HashMap<String, Object> head, HashMap<String, Object> map, final HttpListtener httpListtener) {
if (head == null) {
head = new HashMap<>();
}
if (map == null) {
map = new HashMap<>();
}
Observer observer = new Observer<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (httpListtener != null) {
Log.e("zzz", "onError: " + e.getMessage());
httpListtener.OnError(e.getMessage());
}
}
@Override
public void onNext(ResponseBody responseBody) {
if (httpListtener != null) {
try {
httpListtener.OnSuccess(responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
//请求网络放在子线程
myApiService.get(url, head, map).subscribeOn(Schedulers.io())
//成功后回调到主线程(observeOn)是观察者
.observeOn(AndroidSchedulers.mainThread())
//订阅
.subscribe(observer);
}
//自定义接口
public interface HttpListtener {
void OnSuccess(String jsonStr);
void OnError(String error);
}
}
契约类
public interface MyInterface {
interface MyCallBack<T> {
void onSuccess(T data);
void onError(String error);
}
interface Model {
void getData(String url, HashMap<String, Object> head, HashMap<String, Object> map, Class kind);
}
}
ViewHolder层
public class ViewModule implements MyInterface.Model {
private MyInterface.MyCallBack myCallBack;
public ViewModule(MyInterface.MyCallBack myCallBack) {
this.myCallBack = myCallBack;
}
@Override
public void getData(String url, HashMap<String, Object> head, HashMap<String, Object> map, final Class kind) {
RetrofitUtils.getInstance().get(url, head, map, new RetrofitUtils.HttpListtener() {
@Override
public void OnSuccess(String jsonStr) {
Gson gson = new Gson();
Object o = gson.fromJson(jsonStr, kind);
myCallBack.onSuccess(o);
}
@Override
public void OnError(String error) {
myCallBack.onError(error);
}
});
}
}
Activity的逻辑代码
public class MainActivity extends AppCompatActivity implements MyInterface.MyCallBack {
AbcBinding binding;//(自己的布局文件叫什么,就在Binding前添加什么)
private HashMap<String, Object> head = new HashMap<>();
private HashMap<String, Object> map = new HashMap<>();
private List<MyData.DataBean> mList = new ArrayList<>();
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//绑定布局
binding =DataBindingUtil.setContentView(this,R.layout.abc);
//实现viewholder层
ViewModule viewMode = new ViewModule(this);
//绑定
binding.setName(viewMode);
//调用GET请求
viewMode.getData(Contacts.DATA, head, map, MyData.class);
//可以直接使用binding.调用控件
binding.recy.setLayoutManager(new LinearLayoutManager(this));
//适配器
myAdapter = new MyAdapter(mList,this);
binding.recy.setAdapter(myAdapter);
}
//成功和失败的回调
@Override
public void onSuccess(Object data) {
if (data instanceof MyData) {
MyData myData= (MyData) data;
Log.e("请求成功", "onSuccess: "+myData.getMsg() );
mList.addAll(myData.getData());
myAdapter.notifyDataSetChanged();
}
}
@Override
public void onError(String error) {
Log.e("请求失败", "onError: "+error );
}
}
对应的abc.xml布局文件
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="name"//在activity中有一步是绑定,( binding.setName(viewMode);这一句),这里的name写的什么就set什么
type="movie.bw.com.mvvm.ViewModule"//这个写的是ViewHolder的包名类名全路径
></variable>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
</layout>
适配器工具类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<MyData.DataBean> mData;
private Context mContext;
public MyAdapter(List<MyData.DataBean> mData, Context mContext) {
this.mData = mData;
this.mContext = mContext;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=View.inflate(mContext, R.layout.img,null);
ViewHolder holder=new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
Glide.with(mContext).load(mData.get(i).getThumbnail_pic_s() ).into(viewHolder.imageView);
viewHolder.tv.setText(mData.get(i).getTitle());
}
@Override
public int getItemCount() {
return mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView tv;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView=itemView.findViewById(R.id.img);
tv=itemView.findViewById(R.id.tv);
}
}
}
img.xml文件的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:layout_width="100dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>