添加依赖
compile 'com.jcodecraeer:xrecyclerview:1.5.8' compile 'com.facebook.fresco:fresco:1.3.0' // 支持webp compile 'com.facebook.fresco:webpsupport:1.3.0' // gif加载使用 compile 'com.facebook.fresco:animated-gif:1.3.0' // WebP(静态图+动图)加载使用 compile 'com.facebook.fresco:animated-webp:1.3.0' compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile "io.reactivex.rxjava2:rxjava:2.1.10" compile 'io.reactivex.rxjava2:rxandroid:2.0.2' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'
http包
public class HttpConfig { public static String base_url="https://www.zhaoapi.cn/"; }
public interface MyService { @FormUrlEncoded @POST("quarter/getJokes") Observable<Cros_talkBean> getCros(@FieldMap Map<String,String> map); }
public class RetrofitUtil { //单例模式 private static RetrofitUtil retrofitUtil; private final Retrofit retrofit; public static RetrofitUtil getInstance(){ if (retrofitUtil==null){ retrofitUtil=new RetrofitUtil(); } return retrofitUtil; } //初始化Retrofit public RetrofitUtil(){ OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new MyIntercepter()).build(); retrofit = new Retrofit.Builder() .baseUrl(HttpConfig.base_url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build(); } //通过反射创建子类 public <T> T createRequester(Class<T> clz){ T t = retrofit.create(clz); return t; } //拦截器 class MyIntercepter implements Interceptor{ @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); RequestBody body = request.body(); if (body instanceof FormBody){ FormBody.Builder newBuilder = new FormBody.Builder(); for (int i = 0; i <((FormBody) body).size() ; i++) { String name = ((FormBody) body).name(i); String value = ((FormBody) body).value(i); newBuilder.add(name,value); } newBuilder.add("source","android"); newBuilder.add("appVersion","100"); FormBody body1 = newBuilder.build(); Request request1 = request.newBuilder().post(body1).build(); Response response = chain.proceed(request1); return response; } return null; } } }
view包
public interface IMainView { //展示段子列表 void showCros(List<Cros_talkBean.DataBean> list); //错误的时候提示 void showError(String error); }
public class MainActivity extends AppCompatActivity implements IMainView{ private static final String TAG = "MainActivity======="; private XRecyclerView xrecycler; private ProgressBar progress; private int page=1; private boolean flag=false;//标识是否加载历史数据 private Map<String, String> map; private CrosPresenterlmpl crosPresenterlmpl; private List<Cros_talkBean.DataBean> maxBean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); maxBean = new ArrayList<>(); xrecycler = findViewById(R.id.xrecycler); progress = findViewById(R.id.progress); xrecycler.setLayoutManager(new LinearLayoutManager(this)); crosPresenterlmpl = new CrosPresenterlmpl(); map = new HashMap<>(); //设置上拉下拉 xrecycler.setPullRefreshEnabled(true);//下拉刷新 xrecycler.setLoadingMoreEnabled(true);//上啦加载 xrecycler.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);//样式 xrecycler.setLoadingMoreProgressStyle(ProgressStyle.Pacman); //监听 xrecycler.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() {//刷新 //刷新时每次换一页加载 不保留已经加载的数据 flag=true; page++; getData(); xrecycler.refreshComplete();//关闭刷新的动画 } @Override public void onLoadMore() {//加载更多 //加载更多的时候,保留已经加载的数据,添加新加载的数据 flag=false; progress.setVisibility(View.VISIBLE); page++; new Handler().postDelayed(new Runnable() { @Override public void run() { getData(); } },2000); xrecycler.loadMoreComplete();//关闭加载的动画 } }); getData(); } @Override public void showCros(List<Cros_talkBean.DataBean> list) { Log.e("showCros",""+list); progress.setVisibility(View.GONE); if (flag){ //为true表示加载新的数据和显示历史数据 maxBean.addAll(list); MyAdapter myAdapter=new MyAdapter(this,maxBean); xrecycler.setAdapter(myAdapter); }else {//加载新的数据 maxBean=new ArrayList<>();//刷新时就清空历史数据 MyAdapter myAdapter=new MyAdapter(this,list); xrecycler.setAdapter(myAdapter); } } @Override public void showError(String error) { Log.d(TAG, "showError: 错误-----------"+error); } public void getData(){ map.clear(); map.put("page",page+"");//第一次请求可以传一个死值 crosPresenterlmpl.CrosToView(map,this); } }
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private Context context; private List<Cros_talkBean.DataBean> list; public MyAdapter(Context context, List<Cros_talkBean.DataBean> list) { this.context = context; this.list = list; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.xrecycler_layout, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { SimpleDraweeView image = holder.getImage(); TextView name = holder.getName(); SimpleDraweeView simview = holder.getSimview(); TextView time = holder.getTime(); TextView title = holder.getTitle(); Cros_talkBean.DataBean dataBean = list.get(position); String imgUrls = (String) dataBean.getImgUrls(); String icon = (String) dataBean.getUser().getIcon(); title.setText(dataBean.getContent()); time.setText(dataBean.getCreateTime()+""); name.setText(dataBean.getUser().getNickname()+""); if (null==imgUrls || "".equals(imgUrls)){ }else { image.setImageURI(Uri.parse(imgUrls)); } if (null==icon || "".equals(icon)){ }else { simview.setImageURI(Uri.parse(icon)); } } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private final SimpleDraweeView simview; private final TextView name; private final TextView time; private final TextView title; private final SimpleDraweeView image; public MyViewHolder(View itemView) { super(itemView); simview = itemView.findViewById(R.id.simview); name = itemView.findViewById(R.id.name); time = itemView.findViewById(R.id.time); title = itemView.findViewById(R.id.title); image = itemView.findViewById(R.id.image); } public SimpleDraweeView getSimview() { return simview; } public TextView getName() { return name; } public TextView getTime() { return time; } public TextView getTitle() { return title; } public SimpleDraweeView getImage() { return image; } } }
public class MyAppliction extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
Model层
public interface IModel { //获取数据 void getCros_talk(Map<String,String> map); }
public class CrosModellmpl implements IModel { private static final String TAG = "CrosModellmpl------------"; private IPresenter iPresenter; public CrosModellmpl(IPresenter iPresenter) { this.iPresenter = iPresenter; } @Override public void getCros_talk(Map<String, String> map) { RetrofitUtil.getInstance().createRequester(MyService.class) .getCros(map) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Cros_talkBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Cros_talkBean cros_talkBean) { Log.d(TAG, "onNext: modellmpl----"+cros_talkBean); String code = cros_talkBean.getCode(); if ("0".equals(code)){ iPresenter.getCros_talk(cros_talkBean.getData()); } } @Override public void onError(Throwable e) { iPresenter.getError(e.getMessage()); } @Override public void onComplete() { } }); } }
P层
public interface IPresenter { void CrosToView(Map<String,String> map, IMainView iMainView); void getCros_talk(List<Cros_talkBean.DataBean> list); void getError(String error); }
public class CrosPresenterlmpl implements IPresenter { private static final String TAG = "CrosPresenterlmpl=========="; private IMainView iMainView; private IModel iModel; @Override public void CrosToView(Map<String, String> map, IMainView iMainView) { iModel=new CrosModellmpl(this); this.iMainView = iMainView; iModel.getCros_talk(map); } @Override public void getCros_talk(List<Cros_talkBean.DataBean> list) { // Log.d(TAG, "getCros_talk: presenterlmpl"+list); iMainView.showCros(list); } @Override public void getError(String error) { // Log.e(TAG, "getError: dddddddd"+error ); iMainView.showError(error); } }