mvp+retrofit+rxjava的多类型item展示

原创 2018年04月17日 17:07:14

mvp这个就不需要我介绍了吧!csdn中有很多列子,鸿洋的mvp介绍是非常给力的,希望刚刚学习mvp的童鞋们可以去了解了解。下面我附上鸿洋大神的连接:https://blog.csdn.net/lmj623565791/article/details/46596109

既然网络框架我们使用的是retrofit+rxjava我就简单介绍下如何使用:

涉及到网络请求肯定是需要添加网络请求权限的:<uses-permission android:name="android.permission.INTERNET"/>

retrofit与rxjava的依赖分别是:

compile 'io.reactivex:rxjava:1.1.0'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'

用法介绍

创建接口:

实例:

public void data(final OnHttpCallBack<DatResult> callBack,int page) {
    RetrofitUtils.newInstence("http://10.1.62.121/")
            .create(ApiServer.class).getData(page)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<DatResult>() {
                @Override
                public void onCompleted() {
                }
                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                   
                }

                @Override
                public void onNext(DatResult datResult) {
                    if (datResult.getError() ==0) {
                        Gson gson=new Gson();
                        KLog.e(datResult.toString());
                        callBack.onSuccessful(datResult);//登录成功------获取完数据,返回给P---P获取到数据之后就将数据交回给V
                    } else {
                        callBack.onFaild("参数错误!");//登录失败
                    }
                }
            });
}

一、网络请求工具类:

public class RetrofitUtils {
    private static final int READ_TIMEOUT = 20*1000;//读取超时时间
    private static final int CONN_TIMEOUT = 10*1000;//连接超时时间

    private static Retrofit mRetrofit;

    private RetrofitUtils() {

    }

    public static Retrofit newInstence(String url) {
        mRetrofit = null;
        KLog.e(url);
        OkHttpClient client = new OkHttpClient();//初始化一个client,不然retrofit会自己默认添加一个
        client.setReadTimeout(READ_TIMEOUT, TimeUnit.MINUTES);//设置读取时间为一分钟
        client.setConnectTimeout(CONN_TIMEOUT, TimeUnit.SECONDS);//设置连接时间为12s
          Gson gson = new GsonBuilder()
                                    .registerTypeAdapter(DatResult.class, new OrderedInfoDeserializer())
                                    .create();//接收的多类型Bean文件处理
        mRetrofit = new Retrofit.Builder()
                .client(client)//添加一个client,不然retrofit会自己默认添加一个
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        return mRetrofit;
    }
请求网上很多的,如果我说的不够详细请自己百度查阅下。

重点说下多类型item的应用:

首先每个类型的item与对应的ViewHolder对应详细看下代码

adapter适配器:

public class RecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder> {
    TypeFactory typeFactory;
    ArrayList<DataBean> dataBeans;
    Context context;

    public RecyclerAdapter(Context context, ArrayList<DataBean> dataBeans) {
        this.dataBeans=dataBeans;
        this.typeFactory=new ItemTypeFactory();
        this.context=context;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        return typeFactory.createViewHolder(viewType, view);
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        if (holder instanceof DataBean1ViewHolder) {
            holder.bindViewData(context, dataBeans.get(position));
        }else if(holder instanceof DataBean2ViewHolder){
            holder.bindViewData(context, dataBeans.get(position));
        }else if(holder instanceof DataBean3ViewHolder){
            holder.bindViewData(context, dataBeans.get(position));
        }else if(holder instanceof DataBean4ViewHolder){
            holder.bindViewData(context, dataBeans.get(position));
        }else if(holder instanceof DataBean5ViewHolder){
            holder.bindViewData(context, dataBeans.get(position));
        }else if(holder instanceof DataBean6ViewHolder){
            holder.bindViewData(context, dataBeans.get(position));
        }
    }

    @Override
    public int getItemViewType(int position) {
        return dataBeans.get(position).type(typeFactory);
    }

    @Override
    public int getItemCount() {
        return (dataBeans != null ? dataBeans.size() : 0);
    }
}

对应的接口类有:

TypeFactory类
public interface TypeFactory {
    int type(DataBean1 dataBean1);
    int type(DataBean2 dataBean2);
    int type(DataBean3 dataBean3);
    int type(DataBean4 dataBean4);
    int type(DataBean5 dataBean5);
    int type(DataBean6 dataBean6);
    BaseViewHolder createViewHolder(int type, View itemView);
}
ItemTypeFactory类
public class ItemTypeFactory implements TypeFactory {
    public static final int DATABEAN1_ITEM_LAYOUT = R.layout.item1;
    public static final int DATABEAN2_ITEM_LAYOUT = R.layout.item2;
    public static final int DATABEAN3_ITEM_LAYOUT = R.layout.item3;
    public static final int DATABEAN4_ITEM_LAYOUT = R.layout.item4;
    public static final int DATABEAN5_ITEM_LAYOUT = R.layout.item5;
    public static final int DATABEAN6_ITEM_LAYOUT = R.layout.item6;


    @Override
    public int type(DataBean1 dataBean1) {
        return DATABEAN1_ITEM_LAYOUT;
    }

    @Override
    public int type(DataBean2 dataBean2) {
        return DATABEAN2_ITEM_LAYOUT;
    }

    @Override
    public int type(DataBean3 dataBean3) {
        return DATABEAN3_ITEM_LAYOUT;
    }

    @Override
    public int type(DataBean4 dataBean4) {
        return DATABEAN4_ITEM_LAYOUT;
    }

    @Override
    public int type(DataBean5 dataBean5) {
        return DATABEAN5_ITEM_LAYOUT;
    }

    @Override
    public int type(DataBean6 dataBean6) {
        return DATABEAN6_ITEM_LAYOUT;
    }

    @Override
    public BaseViewHolder createViewHolder(int type, View itemView) {
        switch (type) {
            case DATABEAN1_ITEM_LAYOUT:
                return new DataBean1ViewHolder(itemView);
            case DATABEAN2_ITEM_LAYOUT:
                return new DataBean2ViewHolder(itemView);
            case DATABEAN3_ITEM_LAYOUT:
                return new DataBean3ViewHolder(itemView);
            case DATABEAN4_ITEM_LAYOUT:
                return new DataBean4ViewHolder(itemView);
            case DATABEAN5_ITEM_LAYOUT:
                return new DataBean5ViewHolder(itemView);
            case DATABEAN6_ITEM_LAYOUT:
                return new DataBean6ViewHolder(itemView);
            default:
                return null;
        }
    }
}

对应的bean文件贴出来一个,其余的都差不多:

DataBean1:

public class DataBean1 implements DataBean {
    int type;
    List<UrlItem> items;
    String tip;

    @Override
    public int type(TypeFactory typeFactory) {
        return typeFactory.type(this);
    }

    public class UrlItem{
        String image;
        String url;

        public String getImage() {
            return image;
        }

        public void setImage(String image) {
            this.image = image;
        }

        public String getUrl() {
            return url;
        }

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

        @Override
        public String toString() {
            return "UrlItem{" +
                    "image='" + image + '\'' +
                    ", url='" + url + '\'' +
                    '}';
        }
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public List<UrlItem> getItems() {
        return items;
    }

    public void setItems(List<UrlItem> items) {
        this.items = items;
    }

    public String getTip() {
        return tip;
    }

    public void setTip(String tip) {
        this.tip = tip;
    }

    @Override
    public String toString() {
        return "DataBean1{" +
                "type=" + type +
                ", items=" + items +
                ", tip='" + tip + '\'' +
                '}';
    }
}

ViewHolder同样贴出来一个供大家参考:

public class DataBean1ViewHolder extends BaseViewHolder {
    LinearLayout layoutitem1;
    TextView title;
    Banner banner;
    DataBean1 dataBean1;
    List<String> ImgLists=new ArrayList<String>();

    public DataBean1ViewHolder(View itemView) {
        super(itemView);
        title=itemView.findViewById(R.id.title);
        banner=itemView.findViewById(R.id.mbanner);
        layoutitem1=itemView.findViewById(R.id.layoutitem1);
    }

    @Override
    public void bindViewData(final Context context, Object data) {
        setVisibility(true);
        dataBean1= (DataBean1) data;
        title.setText(dataBean1.getTip());
        ImgLists.clear();
        for (int j = 0; j < dataBean1.getItems().size(); j++) {
            ImgLists.add(dataBean1.getItems().get(j).getImage());
        }
       layoutitem1.setVisibility(View.VISIBLE);

        banner.setImageLoader(new GlideImageLoader());
        //设置图片集合
      banner.setImages(ImgLists);
        //banner设置方法全部调用完毕时最后调用
        banner.start();
        final DataBean1 finalDataBean = dataBean1;
        banner.setOnBannerClickListener(new OnBannerClickListener() {
            @Override
            public void OnBannerClick(int position) {
                String Url = finalDataBean.getItems().get(position - 1).getUrl();
                Intent intent = new Intent();
                intent.putExtra("Url", Url);
                intent.setClass(context, WebActivity.class);
                context.startActivity(intent);
                Toast.makeText(context, "点击了" + position, 1).show();
            }
        });
    }
}

BaseViewHolder类:

public abstract  class BaseViewHolder<T> extends RecyclerView.ViewHolder {
    SparseArray<View> mViews;
    View mItemView;

    public BaseViewHolder(View itemView) {
        super(itemView);
        mItemView = itemView;
        mViews = new SparseArray<>();
    }

    public View getView(int resId) {
        View view = mViews.get(resId);

        if(view== null) {
            view = mItemView.findViewById(resId);
            mViews.put(resId, view);
        }
        return view;
    }
    public void setVisibility(boolean isVisible) {
        RecyclerView.LayoutParams param = (RecyclerView.LayoutParams) itemView.getLayoutParams();
        if (isVisible) {
            param.height = RelativeLayout.LayoutParams.WRAP_CONTENT;// 这里注意使用自己布局的根布局类型
            param.width = RelativeLayout.LayoutParams.MATCH_PARENT;// 这里注意使用自己布局的根布局类型
            itemView.setVisibility(View.VISIBLE);
        } else {
            itemView.setVisibility(View.GONE);
            param.height = 0;
            param.width = 0;
        }
        itemView.setLayoutParams(param);
    }

    public abstract void bindViewData(Context context, T data);
}



RecyclerView用法(一)------展示多种类型Item数据

一、多Item布局实现(MultipleItem) 如果之前你用过ListView实现过此功能,那么你一定对下面这两个方法并不陌生@Override public int getItemVi...
  • cxc19890214
  • cxc19890214
  • 2015-10-18 12:01:20
  • 16850

RecyclerView实现加载多种条目类型,仿新闻列表多种item布局.

本技术博客来自 http://blog.csdn.net/qq_35353487 今天咱们是用RecyclerView来实现这个多种Item的加载. 其实最关键的是要复写RecyclerView的...
  • qq_35353487
  • qq_35353487
  • 2017-07-04 17:12:01
  • 6128

listview多种类型条目显示

一、整个布局是一个listview实线的,而listview里面是嵌套了三种不同展示类型的item,平常只显示一种listview条目,我们会用到常用的四个方法,但是显示不同种类型item的时候,还需...
  • Android_my
  • Android_my
  • 2016-05-29 23:51:37
  • 6771

RecyclerView多种Item类型的消息展示

一.写在前面公司需要做一个消息列表,并且说明,有三种类型。图文,单独图片,单独文字。UI设计图如下。完成后感觉学到点平常没注意的。抽出部分代码做成demo效果如下 二.干货大致思路就是...
  • guozhaohui628
  • guozhaohui628
  • 2017-03-30 17:29:04
  • 504

Android开发之ListView不同类型item的展示

在android开发过程中,我们经常会遇到一些比较复杂的布局,比如说商城类app的首页,需要展示不同的布局,用以体现app界面的美观效果,在这样的情况下,如何灵活运用ListView就显得非常重要了,...
  • emptoney
  • emptoney
  • 2017-06-21 16:21:54
  • 342

RecyclerView的Item多种类型的选择之普通方法实现

首先上效果图:二种不同的管理器以上的状态示意图:我们可以将头部和身体部分以及尾部部分看成三种不同的Type类型代码如下:注释很清晰 第一步:窗口代码@Override protected v...
  • willba
  • willba
  • 2017-06-06 14:52:22
  • 641

Android之ListView展示多类型的条目

以前只写过单一类型的条目,今天学习了一下多类型条目的展示,为避免遗忘,为此在这里记录,写的解释都在代码里面,欢迎其他学习者学习参考: private class MyAdapter extends ...
  • IT142546355
  • IT142546355
  • 2016-08-14 15:34:01
  • 2013

Android--listview多种类型item

1、原理分析                  Adapter对于ListView是非常重要的,它处于listView和数据源的中间,负责为ListView创建具体的视图。之前提到过ListVie...
  • ccc20134
  • ccc20134
  • 2015-08-19 18:04:50
  • 4397

Android 基础(三十五)~ RecyclerView多类型Item的正确实现姿势

简介 RecyclerView是我们开发过程中经常使用到的一个元素,原生的RecyclerView.Adapter基本上可以满足一般的需求,关于RecyclerView的基础介绍请移步: Recy...
  • poorkick
  • poorkick
  • 2017-01-13 16:12:32
  • 3679

Android ListView 不同类型item展示

  • 2017年06月21日 16:02
  • 23.36MB
  • 下载
收藏助手
不良信息举报
您举报文章:mvp+retrofit+rxjava的多类型item展示
举报原因:
原因补充:

(最多只允许输入30个字)