XrecyclerView+Retrofit+RXjava+frescu多条目判断

添加依赖
//butterknife
implementation ‘com.jakewharton:butterknife:8.8.1’
annotationProcessor ‘com.jakewharton:butterknife-compiler:8.8.1’
implementation ‘com.facebook.fresco:fresco:1.8.1’
//添加gson转换器的依赖
compile ‘com.squareup.retrofit2:converter-gson:2.3.0’
//RXJava的依赖
compile “io.reactivex.rxjava2:rxjava:2.1.10”
//RXJava安卓的依赖
compile ‘io.reactivex.rxjava2:rxandroid:2.0.2’

//添加gson转换器的依赖
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

//Gson包
compile ‘com.google.code.gson:gson:2.8.2’
添加权限

 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>

记得配置name
beans

package com.example.zld.lianxitext.bean;

import java.util.List;
public class Beans {
    private int code;
    private String msg;
    private List<NewslistBean> newslist;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<NewslistBean> getNewslist() {
        return newslist;
    }

    public void setNewslist(List<NewslistBean> newslist) {
        this.newslist = newslist;
    }

    public static class NewslistBean {
        /**
         * ctime : 2016-12-04 13:00
         * title : 格林:理解科尔吸食大麻 不过我从没吸过
         * description : NBA新闻
         * picUrl : http://www.51tyw.com/uploads/allimg/161204/1-161204120131.jpg
         * url : http://www.51tyw.com/nba/2421.html
         */

        private String ctime;
        private String title;
        private String description;
        private String picUrl;
        private String url;

        public String getCtime() {
            return ctime;
        }

        public void setCtime(String ctime) {
            this.ctime = ctime;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getPicUrl() {
            return picUrl;
        }

        public void setPicUrl(String picUrl) {
            this.picUrl = picUrl;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

MainActivity

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;

import com.example.zld.lianxitext.bean.Beans;
import com.example.zld.lianxitext.persenter.Mainpersenter;
import com.example.zld.lianxitext.view.IMain;
import com.example.zld.lianxitext.view.MyAdapter;
import com.jcodecraeer.xrecyclerview.ProgressStyle;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements IMain{
    int num=10;
    @BindView(R.id.xrecy)
    XRecyclerView xrecy;
    private Mainpersenter mainpersenter;
    private List<Beans.NewslistBean> newslist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initData(num);
        xrecy.setPullRefreshEnabled(true);
        xrecy.setLoadingMoreEnabled(true);
        xrecy.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
        xrecy.setLoadingMoreProgressStyle(ProgressStyle.Pacman);
        xrecy.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                num=10;
                initData(num);
                xrecy.refreshComplete();
            }

            @Override
            public void onLoadMore() {
                num+=10;
                initData(num);
                xrecy.refreshComplete();
            }
        });
    }
    public  void  initData(int  num){
        mainpersenter = new Mainpersenter(this);

        mainpersenter.getCartData("71e58b5b2f930eaf1f937407acde08fe",num);
    }

    @Override
    public void onSuccess(Beans beans) {
        newslist = beans.getNewslist();
        //适配器
        MyAdapter myAdapter=new MyAdapter(MainActivity.this,newslist);
        xrecy.setAdapter(myAdapter);
        xrecy.setLayoutManager(new LinearLayoutManager(this));

    }

    @Override
    public void onError(Throwable throwable) {
        Log.d("iiii",throwable.getMessage());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mainpersenter!=null){
             mainpersenter.unsubcribe();
        }
    }
}

model
BaseModel

public interface BaseModel {
    void getCartData(String key, int num);
    void unsubcribe();
}

MainMolder

package com.example.zld.lianxitext.model;
import com.example.zld.lianxitext.bean.Beans;
import com.example.zld.lianxitext.persenter.Ipersenter;
import com.example.zld.lianxitext.utils.RetrofitUtil;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class MainMolder implements  BaseModel {
    private  Ipersenter ipersenter;
    private Disposable d;

    public MainMolder(Ipersenter ipersenter) {
      this.ipersenter=ipersenter;
    }
    @Override
    public void getCartData(String key, int num) {
        RetrofitUtil.getService().doGet(key,num)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Beans>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                   MainMolder.this.d=d;
                    }

                    @Override
                    public void onNext(Beans beans) {
                        ipersenter.onSuccess(beans);
                    }

                    @Override
                    public void onError(Throwable e) {
                   ipersenter.onError(e);
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
    @Override
    public void unsubcribe() {
     d.dispose();//接除订阅
    }
}

presenter
BasePersenter

package com.example.zld.lianxitext.persenter;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
public class BasePersenter<T> {
    protected Reference<T> mViewRef;//View接口类型弱引用
    public void attachView(T view) {
        mViewRef = new WeakReference<T>(view); //建立关联
    }
    protected T getView() {
        return mViewRef.get();//获取View
    }
    public boolean isViewAttached() {//判断是否与View建立了关联
        return mViewRef != null && mViewRef.get() != null;
    }
    public void detachView() {//解除关联
        if (mViewRef != null) {
            mViewRef.clear();
            mViewRef = null;
        }
    }
}

Ipersenter

package com.example.zld.lianxitext.persenter;
import com.example.zld.lianxitext.bean.Beans;
public interface Ipersenter {
    void getCartData(String key, int num);
    void unsubcribe();
    void onSuccess(Beans beans);
    void onError(Throwable throwable);
}

Mainpersenter

package com.example.zld.lianxitext.persenter;
import com.example.zld.lianxitext.bean.Beans;
import com.example.zld.lianxitext.model.MainMolder;
import com.example.zld.lianxitext.view.IMain;
public class Mainpersenter  extends  BasePersenter implements  Ipersenter{
    private  MainMolder mainMolder;
    private IMain iMain;
    public Mainpersenter(IMain iMain) {
        this.iMain=iMain;
        mainMolder = new MainMolder(this);
    }
    public void getCartData(String key, int num) {
        mainMolder.getCartData( key, num);
    }
    @Override
    public void unsubcribe() {
        mainMolder.unsubcribe();
    }
    @Override
    public void onSuccess(Beans beans) {
        iMain.onSuccess(beans);
    }
    @Override
    public void onError(Throwable throwable) {
    iMain.onError(throwable);
    }
}

utils
ApiService

package com.example.zld.lianxitext.utils;

import com.example.zld.lianxitext.bean.Beans;

import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ApiService {
    @GET("nba/")
    Observable<Beans> doGet(@Query("key") String key,@Query("num") int num);
}

Contants

package com.example.zld.lianxitext.utils;
public class Contants {
    public  static  String  baseUrl="http://api.tianapi.com/";
}

Retrofitutil

package com.example.zld.lianxitext.utils;

import android.util.Log;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitUtil {
    private static RetrofitUtil retrofitUtil = null;
    private Retrofit retrofit;
    private RetrofitUtil() {
    }
    private RetrofitUtil(String baseUrl) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                //.addNetworkInterceptor()//网络拦截器
                .addInterceptor(new CommonParamsInterceptor())//拦截器
                //.connectTimeout()//连接超时
                .build();
        //创建retrofit
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())//添加转换器
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//设置支持rxjava 注意是2
                .build();
    }
    /**
     * 单例模式
     * @return
     */
    public static RetrofitUtil getInstance(String baseUrl) {
        if (retrofitUtil == null) {
            synchronized (RetrofitUtil.class) {
                if (retrofitUtil == null) {
                    retrofitUtil = new RetrofitUtil(baseUrl);
                }
            }
        }
        return retrofitUtil;
    }

    public <T> T createService(Class<T> service) {
        return retrofit.create(service);
    }
    public static ApiService getService() {
        return RetrofitUtil.getInstance(Contants.baseUrl).createService(ApiService.class);
    }
    /**
     * 公共参数的拦截器
     */
    private static class CommonParamsInterceptor implements Interceptor {
        //intercept方法就是拦截的意思....拦截的是一个请求,,,一旦拦截之后可以对请求的参数进行处理
        //Chain chain 链条的意思
        @Override
        public Response intercept(Chain chain) throws IOException {
            //调用request()方法得到拦截的请求
            Request request = chain.request();
            //获取请求的方式
            String method = request.method();//GET POST
            //拦截的请求的路径
            String oldUrl = request.url().toString();
            Log.e("----oldUrl",oldUrl);
            //要添加的公共参数...map
            Map<String,String> map = new HashMap<>();
            map.put("source","android");
            if ("GET".equals(method)){
                StringBuilder stringBuilder = new StringBuilder();//创建一个stringBuilder...字符串缓冲区
                stringBuilder.append(oldUrl);
                if (oldUrl.contains("?")){
                    //?在最后面....2类型
                    if (oldUrl.indexOf("?") == oldUrl.length()-1){
                    }else {
                        //3类型...拼接上&
                        stringBuilder.append("&");
                    }
                }else {
                    //不包含? 属于1类型,,,先拼接上?号
                    stringBuilder.append("?");
                }
                //添加公共参数....source=android&appVersion=100&
                for (Map.Entry<String,String> entry: map.entrySet()) {
                    //拼接
                    stringBuilder.append(entry.getKey())
                            .append("=")
                            .append(entry.getValue())
                            .append("&");
                }
                //删掉最后一个&符号
                if (stringBuilder.indexOf("&") != -1){
                    stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&"));
                }
                //得到含有公共参数的新路径.....使用新路径去请求
                String newUrl = stringBuilder.toString();
                Log.e("----newUrl",newUrl);
                //新的路径构建一个新的请求
                request = request.newBuilder().url(newUrl).build();
            }else if ("POST".equals(method)){
                //参数在请求的实体内容上....拿到以前的参数,把以前的参数和公共参数全都添加到请求实体上
                RequestBody requestBody = request.body();
                if (requestBody instanceof FormBody){//前边是不是后边的子类/实例对象
                    FormBody oldBody = (FormBody) requestBody;//keywords...page
                    FormBody.Builder builder = new FormBody.Builder();
                    //先添加之前的参数
                    for (int i = 0;i<oldBody.size();i++){
                        //键值对的形式添加
                        builder.add(oldBody.name(i),oldBody.value(i));
                    }
                    //添加公共参数
                    for (Map.Entry<String,String> entry: map.entrySet()) {
                        builder.add(entry.getKey(),entry.getValue());
                    }
                    //构建一个新的请求
                    request = request.newBuilder().url(oldUrl).post(builder.build()).build();
                }
            }
            //执行请求 获取到响应
            Response response = chain.proceed(request);
            return response;
        }
    }
}

IMain

package com.example.zld.lianxitext.view;

import com.example.zld.lianxitext.bean.Beans;
public interface IMain {
    void onSuccess(Beans beans);
    void onError(Throwable throwable);
}

MyAdapter

package com.example.zld.lianxitext.view;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.zld.lianxitext.R;
import com.example.zld.lianxitext.bean.Beans;
import com.facebook.drawee.view.SimpleDraweeView;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private List<Beans.NewslistBean> list;
    private static  int  IMAGE_BASE=0;
    private static  int  TEXT_BASE=1;
    public MyAdapter(Context context, List<Beans.NewslistBean> list) {
        this.context = context;
        this.list = list;
    }
    @Override
    public int getItemViewType(int position) {
        if (position==0){
            return  IMAGE_BASE;
        }else if (position==1){
            return   TEXT_BASE;
        }else {
            return IMAGE_BASE;
        }
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         if (viewType == IMAGE_BASE){
             View view=View.inflate(context, R.layout.textleft,null);
             MyHolder myHolder=new MyHolder(view);
             return myHolder;
         }else {
             View view=View.inflate(context, R.layout.tv_item,null);
             TextHolder textHolder=new TextHolder(view);
             return textHolder;
         }
    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof  MyHolder){
           ((MyHolder) holder).img.setImageURI(list.get(position).getPicUrl());
            ((MyHolder) holder).left_tv.setText(list.get(position).getTitle());
        }else  if (holder instanceof  TextHolder){
            ((TextHolder) holder).tv.setText(list.get(position).getTitle());
        }
    }
    @Override
    public int getItemCount() {
        return list.size();
    }
}
class  MyHolder extends RecyclerView.ViewHolder{
    @BindView(R.id.img)
    public SimpleDraweeView img;
    @BindView(R.id.left_tv)
    public TextView left_tv;
    public MyHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this,itemView);
    }
    }
class  TextHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.tv)
    public TextView tv;
    public TextHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);

    }
}

MyApption

package com.example.zld.lianxitext;
import android.app.Application;
import com.facebook.drawee.backends.pipeline.Fresco;
public class MyApption extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值