1 导考试文件中的包
2 创建bean类
//http://172.17.8.100/movieApi/movie/v1/findReleaseMovieList?page=1&count=20
public class MovieBean {
private String message;
private String status;
private List<ResultBean> result;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<ResultBean> getResult() {
return result;
}
public void setResult(List<ResultBean> result) {
this.result = result;
}
public static class ResultBean {
private int followMovie;
private int id;
private String imageUrl;
private String name;
private int rank;
private long releaseTime;
private String releaseTimeShow;
private String summary;
@Override
public String toString() {
return "ResultBean{" +
"followMovie=" + followMovie +
", id=" + id +
", imageUrl='" + imageUrl + '\'' +
", name='" + name + '\'' +
", rank=" + rank +
", releaseTime=" + releaseTime +
", releaseTimeShow='" + releaseTimeShow + '\'' +
", summary='" + summary + '\'' +
'}';
}
public int getFollowMovie() {
return followMovie;
}
public void setFollowMovie(int followMovie) {
this.followMovie = followMovie;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public long getReleaseTime() {
return releaseTime;
}
public void setReleaseTime(long releaseTime) {
this.releaseTime = releaseTime;
}
public String getReleaseTimeShow() {
return releaseTimeShow;
}
public void setReleaseTimeShow(String releaseTimeShow) {
this.releaseTimeShow = releaseTimeShow;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
}
@Override
public String toString() {
return "MovieBean{" +
"message='" + message + '\'' +
", status='" + status + '\'' +
", result=" + result +
'}';
}
}
3 创建Api接口
public interface APi {
//http://172.17.8.100/movieApi/movie/v1/findReleaseMovieList?page=1&count=20
// @GET(?号前不固定的那部分网址,利用@Query传参)
@GET("movieApi/movie/v1/findReleaseMovieList")
Observable《MovieBean》 getMovieBean(@Query("page") int page, @Query("count") int count);
}
4 创建工具类
public class OkHttpUtils {
public final APi api;
//单例
private static OkHttpUtils httpUtilsr=null;
public static OkHttpUtils getInstance(){
httpUtilsr = new OkHttpUtils();
return httpUtilsr;
}
//私有化的构造方法
private OkHttpUtils (){
//创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.writeTimeout(5,TimeUnit.SECONDS)
.readTimeout(5,TimeUnit.SECONDS)
.addNetworkInterceptor(new LogginInterceptor())
.build();
//创建retrofit对象
Retrofit retrofit = new Retrofit
.Builder()
//baseUrl(“就是写接口固定不变的前半部分”)
.baseUrl("http://172.17.8.100/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
//实例化接口
api = retrofit.create(APi.class);
}
//拦截器
private class LogginInterceptor implements Interceptor {
@Override
public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
RequestBody body = request.body();
Headers headers = request.headers();
okhttp3.Response response = chain.proceed(request);
Headers headers1 = response.headers();
return response;
}
}
}
5 interface
public interface GetDate《T》 {
void loadCurrentDate(T t);
void refresh(T t);
void loadMore(T t);
}
7 Presenter的base
public abstract class BasePresenter《V》 {
V view;
public V getView() { return view; }
public void setView(V view) { this.view = view; }
public void jie(){ this.view = null; }
}
8 Presenter
public class Presenter extends BasePresenter {
public void loadCurrentDate(){
OkHttpUtils okHttpUtils = OkHttpUtils.getInstance();
Observable<MovieBean> movieBean = okHttpUtils.api.getMovieBean(1,10);
movieBean.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MovieBean>() {
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MovieBean movieBean) {
GetDate getDate = (GetDate) getView();
getDate.loadCurrentDate(movieBean);
}
});
}
public void refresh(){
OkHttpUtils okHttpUtils = OkHttpUtils.getInstance();
Observable<MovieBean> movieBean = okHttpUtils.api.getMovieBean(1,10);
movieBean.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MovieBean>() {
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MovieBean movieBean) {
GetDate getDate = (GetDate) getView();
getDate.refresh(movieBean);
}
});
}
public void loadMore(){
OkHttpUtils okHttpUtils = OkHttpUtils.getInstance();
Observable<MovieBean> movieBean = okHttpUtils.api.getMovieBean(1,20);
movieBean.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MovieBean>() {
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MovieBean movieBean) {
GetDate getDate = (GetDate) getView();
getDate.loadMore(movieBean);
}
});
}
}
9 Acivity的base
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getView());
initView();
initDate();
showView();
}
public abstract int getView();
public abstract void initDate();
public abstract void initView();
public abstract void showView();
}
10 activity.xml
<?xml version="1.0" encoding="utf-8"?>
《LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"》
<!--注意高度不能设置为match_parent 要设置成wrap_content-->
《com.jcodecraeer.xrecyclerview.XRecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/XRecyclerView"
/》
《/LinearLayout》
11 MainActivity
public class MainActivity extends BaseActivity implements GetDate{
private XRecyclerView xRecyclerView;
private Presenter presenter;
private Handler handler;
private Madapter adapter;
@Override
public int getView() {
return R.layout.activity_main;
}
@Override
public void initView() {
xRecyclerView = findViewById(R.id.XRecyclerView);
}
@Override
public void initDate() {
presenter = new Presenter();
presenter.setView(this);
presenter.loadCurrentDate();
}
@Override
public void showView() {
xRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
adapter = new Madapter();
xRecyclerView.setAdapter(adapter);
handler = new Handler();
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
presenter.refresh();
xRecyclerView.refreshComplete();
}},1000);
}
@Override
public void onLoadMore() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
presenter.loadMore();
xRecyclerView.loadMoreComplete();
}
},1000);
}
});
}
@Override
public void loadCurrentDate(Object o) {
MovieBean bean= (MovieBean) o;
List<MovieBean.ResultBean> result = bean.getResult();
adapter.getDate(result,MainActivity.this,false);
}
@Override
public void refresh(Object o) {
MovieBean bean= (MovieBean) o;
List<MovieBean.ResultBean> result = bean.getResult();
adapter.getDate(result,MainActivity.this,false);
}
@Override
public void loadMore(Object o) {
MovieBean bean= (MovieBean) o;
List<MovieBean.ResultBean> result = bean.getResult();
adapter.getDate(result,MainActivity.this,true);
}
//防止内存泄漏
@Override
protected void onDestroy() {
super.onDestroy();
presenter.jie();
}
}
12 item.xml
<?xml version="1.0" encoding="utf-8"?>
《LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
》
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:id="@+id/name"
/》
</LinearLayout》
13 Adapter
public class Madapter extends XRecyclerView.Adapter {
Context context;
List<MovieBean.ResultBean> result=new ArrayList<>();
private ViewHolder holder1;
public void getDate(List<MovieBean.ResultBean> result, Context context,boolean b){
this.context=context;
if (b){
this.result.addAll(result);
notifyDataSetChanged();
}else {
this.result.clear();
this.result.addAll(result);
notifyDataSetChanged();
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item,null);
holder1 = new ViewHolder(view);
return holder1;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
holder1.name.setText(result.get(position).getName()+"");
}
@Override
public int getItemCount() {
return this.result.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private final TextView name;
public ViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
}
}
}