retrofit+rxjava+母子列表展示+mvp

依赖:

compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.android.support:recyclerview-v7:26.1.0'
//黄油刀
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//图片加载框架
compile 'com.facebook.fresco:fresco:0.12.0'
//访问网络
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
compile 'com.squareup.retrofit2:converter-gson:2.4.0'
//compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//RxJava
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'

compile 'com.github.userswlwork:pull-to-refresh:1.0.0'
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
compile 'org.greenrobot:greendao:3.2.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
compile 'com.github.bumptech.glide:glide:3.7.0'

权限

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

布局

1.mainActivity

<?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"
    android:orientation="horizontal"
    tools:context="com.example.slx.exam_classify.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/rv_left"
        android:layout_weight="3">

    </android.support.v7.widget.RecyclerView>
    <android.support.v7.widget.RecyclerView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/rv_right"
        android:layout_weight="8">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

2.左边的布局

<?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="wrap_content"
    android:background="#fff"
    android:padding="15dp"
    android:gravity="center">
    <TextView
        android:gravity="center"
        android:textColor="#000"
        android:id="@+id/name"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

3.右边的布局

<?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="wrap_content"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text"/>
    <com.example.slx.exam_classify.gridView.MyGridView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/grid"></com.example.slx.exam_classify.gridView.MyGridView>
</LinearLayout>
4.右边 布局的子布局
<?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="wrap_content"
    android:orientation="vertical"
    android:gravity="center">
    <ImageView
        android:layout_width="66dp"
        android:layout_height="66dp"
        android:id="@+id/img"/>
    <TextView
        android:layout_marginTop="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/name"/>

</LinearLayout>
 

bean

public class MessageBean<T> {
    private String mag;
    private String code;
    private List<T> data;
public class LeftBean {
    private int cid;
    private String createtime;
    private String icon;
    private int ishome;
    private String name;
public class RightBean<T> {
    private String cid;
    private List<T> list;
    private String name;
    private String pcid;
public class RightBeanList {


    private String icon;
    private String name;
    private int pcid;
    private int pscid;
utils

package com.example.slx.exam_classify.utils;

import android.os.Vibrator;

import com.example.slx.exam_classify.http.ApiService;
import com.example.slx.exam_classify.http.ServiceUrl;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by lenovo on 2018/4/20.
 */

public class HttpNetUtils {
    private static volatile HttpNetUtils instance;
    private final Retrofit retrofit;

    public static HttpNetUtils getInstance(){
        if(instance==null){
            synchronized (HttpNetUtils.class){
                if(null==instance){
                    instance=new HttpNetUtils();
                }
            }
        }
        return instance;
    }



    private HttpNetUtils(){


        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(ServiceUrl.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }
    //retrofit自定义的接口
    public ApiService getService(){
        return retrofit.create(ApiService.class);
    }

}

http

package com.example.slx.exam_classify.http;

/**
 * Created by lenovo on 2018/4/20.
 */

public class ServiceUrl {
    public static final String BASE_URL = "https://www.zhaoapi.cn/product/";

}
package com.example.slx.exam_classify.http;

import com.example.slx.exam_classify.bean.LeftBean;
import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;

import io.reactivex.Flowable;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * fetrofit的借口定义
 * Created by lenovo on 2018/4/20.
 */

public interface ApiService {
    @GET("getCatagory")
    Flowable<MessageBean<LeftBean>> getLeft() ;
    @GET("getProductCatagory")
    Flowable<MessageBean<RightBean<RightBeanList>>> getRight(@Query("cid")String cid);
}

inter

package com.example.slx.exam_classify.inter;

import com.example.slx.exam_classify.bean.LeftBean;
import com.example.slx.exam_classify.bean.MessageBean;

/**
 * Created by lenovo on 2018/4/20.
 */

public interface ILeftView {
    void liftSuccess(MessageBean<LeftBean> leftBeanMessageBean);
}
package com.example.slx.exam_classify.inter;

import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;

/**
 * Created by lenovo on 2018/4/20.
 */

public interface IRightView {

    void rightSuccess(MessageBean<RightBean<RightBeanList>> rightBeanMessageBean);
}
package com.example.slx.exam_classify.inter;

import com.example.slx.exam_classify.bean.LeftBean;
import com.example.slx.exam_classify.bean.MessageBean;

/**
 * Created by lenovo on 2018/4/20.
 */

public interface ILeftPresenter {

    void success(MessageBean<LeftBean> leftBeanMessageBean);
}
package com.example.slx.exam_classify.inter;

import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;

/**
 * Created by lenovo on 2018/4/20.
 */

public interface IRightPresenter {
    void success(MessageBean<RightBean<RightBeanList>> rightBeanMessageBean);
}

v层

package com.example.slx.exam_classify;

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

import com.example.slx.exam_classify.adapter.LeftAdapter;
import com.example.slx.exam_classify.adapter.RightAdapter;
import com.example.slx.exam_classify.bean.LeftBean;
import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;
import com.example.slx.exam_classify.inter.ILeftView;
import com.example.slx.exam_classify.inter.IRightView;
import com.example.slx.exam_classify.presenter.LeftPresenter;
import com.example.slx.exam_classify.presenter.RightPresenter;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements ILeftView ,IRightView{

    @BindView(R.id.rv_left)
    RecyclerView rvLeft;
    @BindView(R.id.rv_right)
    RecyclerView rvRight;

    private LeftAdapter leftAdapter;
    private List<LeftBean> leftList;
    private RightPresenter rightPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);
        /**
         * 左边
         */
        //给左边设置布局
        rvLeft.setLayoutManager(new LinearLayoutManager(this));
        //创建左边p层对象
        LeftPresenter leftPresenter = new LeftPresenter(this);
        //调用左边p层的netLeftWork()方法
        leftPresenter.netLeftWork();
        //创建左边新的list,集合里面为空。
        leftList = new ArrayList<>();
        //创建左边的适配器
        leftAdapter = new LeftAdapter(MainActivity.this,leftList);
        rvLeft.setAdapter(leftAdapter);
        /**
         * 右边
         */
        //给右边设置布局
        rvRight.setLayoutManager(new LinearLayoutManager(this));
        //创建右边p层对象
        rightPresenter = new RightPresenter(this);
        //调用右边p层的netLeftWork()方法,默认传入的参数cid=1,方便展示cid=1数据,而不是空白一片。
        rightPresenter.netRightWork("1");

        //4.
        leftAdapter.setOnItemClickListener(new LeftAdapter.OnItemClickListener() {
            @Override
            public void itemClick(int position) {
                rightPresenter.netRightWork(String.valueOf(position));
            }
        });

    }

    /**
     * v层左边liftSuccess成功的方法
     * @param
     */
    @Override
    public void liftSuccess(MessageBean<LeftBean> leftBeanMessageBean) {
        //把leftList先清空。
        leftList.clear();
        //清空后再给leftList赋值。
        leftList.addAll(leftBeanMessageBean.getData());
        //刷新适配器
        leftAdapter.notifyDataSetChanged();

    }
    /**
     * v层右边liftSuccess成功的方法
     * @param
     */
    @Override
    public void rightSuccess(MessageBean<RightBean<RightBeanList>> rightBeanMessageBean) {
        //得到右边集合rightList
        List<RightBean<RightBeanList>> rightList = rightBeanMessageBean.getData();
        //给右边设置适配器
        RightAdapter rightAdapter = new RightAdapter(MainActivity.this, rightList);
        rvRight.setAdapter(rightAdapter);
    }
}

p层

package com.example.slx.exam_classify.presenter;

import com.example.slx.exam_classify.bean.LeftBean;
import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.inter.ILeftPresenter;
import com.example.slx.exam_classify.inter.ILeftView;
import com.example.slx.exam_classify.model.LeftModel;

/**
 * Created by lenovo on 2018/4/20.
 */

public class LeftPresenter implements ILeftPresenter {

    private final LeftModel leftModel;
    ILeftView ILeftView;
    public LeftPresenter(ILeftView ILeftView){
        leftModel = new LeftModel();
        this.ILeftView = ILeftView;
    }
    public void netLeftWork() {
        leftModel.getLeftData(this);
    }

    @Override
    public void success(MessageBean<LeftBean> leftBeanMessageBean) {
        ILeftView.liftSuccess( leftBeanMessageBean);
    }
}
package com.example.slx.exam_classify.presenter;

import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;
import com.example.slx.exam_classify.inter.IRightPresenter;
import com.example.slx.exam_classify.inter.ILeftView;
import com.example.slx.exam_classify.inter.IRightView;
import com.example.slx.exam_classify.model.RightModel;

/**
 * Created by lenovo on 2018/4/20.
 */

public class RightPresenter implements IRightPresenter {

    IRightView iRightView;
    private final RightModel rightModel;

    public RightPresenter(IRightView iRightView){
        rightModel = new RightModel();
        this.iRightView = iRightView;
    }
    @Override
    public void success(MessageBean<RightBean<RightBeanList>> rightBeanMessageBean) {
        iRightView.rightSuccess(rightBeanMessageBean);
    }

    public void netRightWork(String cid) {
        rightModel.getRightData(cid,this);
    }
}

m层

package com.example.slx.exam_classify.model;

import com.example.slx.exam_classify.bean.LeftBean;
import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.http.ApiService;
import com.example.slx.exam_classify.inter.ILeftPresenter;
import com.example.slx.exam_classify.utils.HttpNetUtils;

import io.reactivex.Flowable;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subscribers.DisposableSubscriber;

/**
 * Created by lenovo on 2018/4/20.
 */

public class LeftModel {
    public void getLeftData(final ILeftPresenter ILeftPresenter) {
        //调用工具类,得到被观察者
        final HttpNetUtils instance = HttpNetUtils.getInstance();
        ApiService service = instance.getService();
        Flowable<MessageBean<LeftBean>> left = service.getLeft();

        left.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
                //创建被观察者对象
            .subscribe(new DisposableSubscriber<MessageBean<LeftBean>>() {
                @Override
                public void onNext(MessageBean<LeftBean> leftBeanMessageBean) {
                    ILeftPresenter.success(leftBeanMessageBean);
                }

                @Override
                public void onError(Throwable t) {

                }

                @Override
                public void onComplete() {

                }
            });
    }
}
package com.example.slx.exam_classify.model;

import com.example.slx.exam_classify.bean.MessageBean;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;
import com.example.slx.exam_classify.http.ApiService;
import com.example.slx.exam_classify.inter.IRightPresenter;
import com.example.slx.exam_classify.presenter.RightPresenter;
import com.example.slx.exam_classify.utils.HttpNetUtils;

import io.reactivex.Flowable;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subscribers.DisposableSubscriber;

/**
 * Created by lenovo on 2018/4/20.
 */

public class RightModel {
    public void getRightData(String cid, final IRightPresenter iRightPresenter) {

        HttpNetUtils instance = HttpNetUtils.getInstance();
        ApiService service = instance.getService();
        Flowable<MessageBean<RightBean<RightBeanList>>> right = service.getRight(cid);

        right.subscribeOn(Schedulers.io())
             .observeOn(AndroidSchedulers.mainThread())
             .subscribe(new DisposableSubscriber<MessageBean<RightBean<RightBeanList>>>() {
                 @Override
                 public void onNext(MessageBean<RightBean<RightBeanList>> rightBeanMessageBean) {
                     iRightPresenter.success(rightBeanMessageBean);
                 }

                 @Override
                 public void onError(Throwable t) {

                 }

                 @Override
                 public void onComplete() {

                 }
             });
    }
}

适配器

package com.example.slx.exam_classify.adapter;

import android.content.Context;
import android.content.pm.LabeledIntent;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.slx.exam_classify.R;
import com.example.slx.exam_classify.bean.LeftBean;

import java.util.List;

/**
 * Created by Administrator on 2018/4/12 0012.
 */

public class LeftAdapter extends RecyclerView.Adapter{
    private List<LeftBean>  list;
    private Context context;
    private int index = 0;
    //2.
    OnItemClickListener listener;

    public LeftAdapter(Context context, List<LeftBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater from = LayoutInflater.from(context);

        View view = from.inflate(R.layout.layout_left, parent, false);
        //创建ViewHolder  把view通过构造方法传过去
        MyViewHolder myViewHolder = new MyViewHolder(view);

        return myViewHolder;
    }


    //绑定view简单的可以认为是给item设置数据用的
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        final MyViewHolder myViewHolder = (MyViewHolder) holder;
        myViewHolder.tv.setText(list.get(position).getName());
       //6.
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //左边条目的背景 颜色
                myViewHolder.itemView.setBackgroundColor(Color.parseColor("#cccccc"));
                //左边条目的文字 颜色
                myViewHolder.tv.setTextColor(Color.RED);
                //给index赋值
                index = position;
                notifyDataSetChanged();
                //5.
                listener.itemClick(position);
            }
        });
        //点击条目的时候切换背景和文字颜色
        if(index == position){
            myViewHolder.itemView.setBackgroundColor(Color.parseColor("#cccccc"));
            myViewHolder.tv.setTextColor(Color.RED);
        }else {
            myViewHolder.itemView.setBackgroundColor(Color.parseColor("#FFFFFf"));
            myViewHolder.tv.setTextColor(Color.BLACK);
        }




    }

    //item的个数
    @Override
    public int getItemCount() {
        return list.size();
    }

    //内部类创建V,在此方法中,寻找控件
    class MyViewHolder extends RecyclerView.ViewHolder{
        private final TextView tv;

        public MyViewHolder(View view) {
            super(view);
            tv = view.findViewById(R.id.name);
        }
    }

    //3.recyclerView的监听事件
    public void setOnItemClickListener(OnItemClickListener listener){
        this.listener = listener;
    }
    //1.自定义的监听接口
    public interface OnItemClickListener{
        void  itemClick(int position);
    }


}
package com.example.slx.exam_classify.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.TextView;

import com.example.slx.exam_classify.R;
import com.example.slx.exam_classify.bean.RightBean;
import com.example.slx.exam_classify.bean.RightBeanList;

import java.nio.file.Path;
import java.util.List;

/**
 * Created by lenovo on 2018/4/20.
 */

public class RightAdapter extends RecyclerView.Adapter{
    private Context context;
    private List<RightBean<RightBeanList>> rightList;

    public RightAdapter(Context context, List<RightBean<RightBeanList>> rightList) {
        this.context = context;
        this.rightList = rightList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater from = LayoutInflater.from(context);
        View view = from.inflate(R.layout.layout_right, parent, false);
        //创建ViewHolder  把view通过构造方法传过去
        MyViewHolder myViewHolder = new MyViewHolder(view);

        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final MyViewHolder myViewHolder = (MyViewHolder) holder;
        myViewHolder.text.setText(rightList.get(position).getName());

        RightAdapterItem rightAdapterItem = new RightAdapterItem(context,rightList.get(position).getList());
        myViewHolder.grid.setNumColumns(3);
        myViewHolder.grid.setAdapter(rightAdapterItem);
    }

    @Override
    public int getItemCount() {
        return rightList.size();
    }
    //内部类创建V,在此方法中,寻找控件
    class MyViewHolder extends RecyclerView.ViewHolder{
        private final TextView text;
        private GridView grid;
        public MyViewHolder(View view) {
            super(view);
            text = view.findViewById(R.id.text);
            grid=view.findViewById(R.id.grid);
        }
    }
}
package com.example.slx.exam_classify.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.slx.exam_classify.R;
import com.example.slx.exam_classify.bean.RightBeanList;

import java.util.List;

/**
 * Created by lenovo on 2018/4/20.
 */

public class RightAdapterItem extends BaseAdapter {

    private Context context;
    private List<RightBeanList> list;

    public RightAdapterItem(Context context, List<RightBeanList> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if(view == null){
            LayoutInflater from = LayoutInflater.from(context);
            view = from.inflate(R.layout.layout_right_item, viewGroup, false);
            //view = View.inflate(context, R.layout.layout_right_item,null);
            holder = new ViewHolder();
            holder.img = view.findViewById(R.id.img);
            holder.name = view.findViewById(R.id.name);
            view.setTag(holder);
        }else {
            holder = (ViewHolder) view.getTag();
        }
        holder.name.setText(list.get(i).getName());
        Glide.with(context).load(list.get(i).getIcon()).into(holder.img);
        return view;
    }

    class ViewHolder{
        ImageView img;
        TextView name;
    }
}
MyGridView(适配gridview)
package com.example.slx.exam_classify.gridView;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;

/**
 * 自定义gridView的高
 * Created by lenovo on 2018/4/21.
 */

public class MyGridView extends GridView{
    public MyGridView(Context context) {
        super(context);
    }

    public MyGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int newHight=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, newHight);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值