仿京东APP分类页面(mvp模式+OkHttp封装工具类+拦截器+弱引用回收)

仿京东APP分类页面:
 
添加依赖
compile 'com.android.support:recyclerview-v7:24.0.0'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0'
compile 'jp.wasabeef:glide-transformations:2.0.1'
compile 'com.jcodecraeer:xrecyclerview:1.5.9'

添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>

xml布局
一.首页面需要两个recyclerview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="#eee"
    tools:context="com.example.monthpractice1.view.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/left_list"
        android:layout_width="100dp"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/right_list"
        android:layout_marginLeft="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>

二.创建左侧和右侧recyclerview的item布局
1左侧
<?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:orientation="vertical"
    >

    <TextView
        android:id="@+id/left_title"
        android:padding="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
2右侧
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<TextView
    android:id="@+id/item_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/item_list"
        android:background="#fff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</LinearLayout>
3.右侧recyclerview的item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp">

    <ImageView
        android:id="@+id/myimg"
        android:layout_width="match_parent"
        android:layout_height="60dp" />

    <TextView
        android:id="@+id/mytitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp" />
</LinearLayout>
Java代码:mvp模式+OkHttp封装工具类+拦截器+弱引用回收

1.utils包
OKhttpUtil类:
package com.example.monthpractice1.utils;

import android.os.Environment;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by mamiaomiao on 2018/2/27.
 */

public class OkhttpUtil {
    private static OkhttpUtil util;

    private OkhttpUtil() {
    }

    public OkhttpUtil getInstance() {
        if (util == null) {
            synchronized (OkhttpUtil.class) {
                if (util == null) {
                    util = new OkhttpUtil();
                }
            }
        }
        return util;
    }

    private static OkHttpClient okHttpClient;

    private static OkHttpClient getOkHttpClient() {

        if (okHttpClient == null) {
            File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");
            int cacheSize = 10 * 1024 * 1024;
            okHttpClient = new OkHttpClient.Builder()
//                    .addInterceptor(new Interceptor() {
//                        @Override
//                        public Response intercept(Chain chain) throws IOException {
//                            Request request = chain.request();
//                            Request builder = request.newBuilder().header("source", "android").build();
//                            Response response = chain.proceed(builder);
//                            return response;
//                        }
//                    })
                    .connectTimeout(15, TimeUnit.SECONDS)
                    //.cache(new Cache(sdcache, cacheSize))
                    .build();
        }
        return okHttpClient;
    }

    /**
     * get请求
     * 参数1 url
     * 参数2 回调Callback
     */

    public static void doGet(String url, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        //创建Request
        Request request = new Request.Builder().url(url).build();
        //得到Call对象
        Call call = okHttpClient.newCall(request);
        //执行异步请求
        call.enqueue(callback);


    }

    /**
     * post请求
     * 参数1 url
     * 参数2 回调Callback
     */

    public static void doPost(String url, Map<String, String> params, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        //3.x版本post请求换成FormBody 封装键值对参数
        FormBody.Builder builder = new FormBody.Builder();
        //遍历集合
        for (String key : params.keySet()) {
            builder.add(key, params.get(key));
        }
        //创建Request
        Request request = new Request.Builder().url(url).post(builder.build()).build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);

    }

}

 GsonObjectCallback类

package com.example.monthpractice1.utils;
import android.os.Handler;

import com.google.gson.Gson;

import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * 1. 类的用途 如果要将得到的json直接转化为集合 建议使用该类
 * 该类的onUi() onFailed()方法运行在主线程
 * 2. @author forever
 * 3. @date 2017/9/24 18:47
 */

public abstract class GsonObjectCallback<T> implements Callback {
    private Handler handler = new Handler();

    //主线程处理
    public abstract void onUi(T t);

    //主线程处理
    public abstract void onFailed(Call call, IOException e);

    //请求失败
    @Override
    public void onFailure(final Call call, final IOException e) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                onFailed(call, e);
            }
        });
    }

    //请求json 并直接返回泛型的对象 主线程处理
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String json = response.body().string();
        Class<T> cls = null;

        Class clz = this.getClass();
        ParameterizedType type = (ParameterizedType) clz.getGenericSuperclass();
        Type[] types = type.getActualTypeArguments();
        cls = (Class<T>) types[0];
        Gson gson = new Gson();
        final T t = gson.fromJson(json, cls);
        handler.post(new Runnable() {
            @Override
            public void run() {
            onUi(t);
            }
        });
    }
}
2.Bean类
 
左侧recyclerview的bean
package com.example.monthpractice1.bean;

import java.util.List;

/**
 * Created by mamiaomiao on 2018/2/27.
 * 1.	商品分类接口
 https://www.zhaoapi.cn/product/getCatagory

 */

public class CatagoryBean {

    /**
     * msg :
     * code : 0
     * data : [{"cid":1,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/shop.png","ishome":1,"name":"京东超市"},{"cid":2,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/qqg.png","ishome":1,"name":"全球购"},{"cid":3,"createtime":"2017-10-10T19:45:11","icon":"http://120.27.23.105/images/category/phone.png","ishome":1,"name":"手机数码"},{"cid":5,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/man.png","ishome":1,"name":"男装"},{"cid":6,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girl.png","ishome":1,"name":"女装"},{"cid":7,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/manshoe.png","ishome":1,"name":"男鞋"},{"cid":8,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girlshoe.png","ishome":1,"name":"女鞋"},{"cid":9,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/shirt.png","ishome":1,"name":"内衣配饰"},{"cid":10,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/bag.png","ishome":1,"name":"箱包手袋"},{"cid":11,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/beauty.png","ishome":1,"name":"美妆个护"},{"cid":12,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/jewel.png","ishome":1,"name":"钟表珠宝"},{"cid":13,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/luxury.png","ishome":1,"name":"奢侈品"},{"cid":14,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/computer.png","ishome":1,"name":"电脑办公"},{"cid":15,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"家用电器"},{"cid":16,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"食品生鲜"},{"cid":17,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"酒水饮料"},{"cid":18,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"母婴童装"},{"cid":19,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"玩具乐器"},{"cid":20,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"医药保健"}]
     */

    private String msg;
    private String code;
    private List<DataBean> data;

    public String getMsg() {
        return msg;
    }

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

    public String getCode() {
        return code;
    }

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

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * cid : 1
         * createtime : 2017-10-10T19:41:39
         * icon : http://120.27.23.105/images/category/shop.png
         * ishome : 1
         * name : 京东超市
         */

        private int cid;
        private String createtime;
        private String icon;
        private int ishome;
        private String name;

        public int getCid() {
            return cid;
        }

        public void setCid(int cid) {
            this.cid = cid;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        public String getIcon() {
            return icon;
        }

        public void setIcon(String icon) {
            this.icon = icon;
        }

        public int getIshome() {
            return ishome;
        }

        public void setIshome(int ishome) {
            this.ishome = ishome;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
右侧reclerview的bean类
package com.example.monthpractice1.bean;

import java.util.List;

/**
 * Created by mamiaomiao on 2018/2/27.
 * https://www.zhaoapi.cn/product/getProductCatagory
 请求参数:
 cid 商品分类id  string字符串  必传

 */

public class GroupGoodsBean {

    /**
     * msg : 获取子分类成功
     * code : 0
     * data : [{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"月饼","pcid":1,"pscid":1},{"icon":"http://120.27.23.105/images/icon.png","name":"坚果炒货","pcid":1,"pscid":2},{"icon":"http://120.27.23.105/images/icon.png","name":"糖巧","pcid":1,"pscid":3},{"icon":"http://120.27.23.105/images/icon.png","name":"休闲零食","pcid":1,"pscid":4},{"icon":"http://120.27.23.105/images/icon.png","name":"肉干肉脯","pcid":1,"pscid":5},{"icon":"http://120.27.23.105/images/icon.png","name":"饼干蛋糕","pcid":1,"pscid":6},{"icon":"http://120.27.23.105/images/icon.png","name":"蜜饯果干","pcid":1,"pscid":7},{"icon":"http://120.27.23.105/images/icon.png","name":"无糖食品","pcid":1,"pscid":8}],"name":"休闲零食","pcid":"1"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"新鲜水果","pcid":2,"pscid":9},{"icon":"http://120.27.23.105/images/icon.png","name":"海鲜水产","pcid":2,"pscid":10},{"icon":"http://120.27.23.105/images/icon.png","name":"精选肉类","pcid":2,"pscid":11},{"icon":"http://120.27.23.105/images/icon.png","name":"蛋类","pcid":2,"pscid":12},{"icon":"http://120.27.23.105/images/icon.png","name":"新鲜蔬菜","pcid":2,"pscid":13},{"icon":"http://120.27.23.105/images/icon.png","name":"冷冻食品","pcid":2,"pscid":14},{"icon":"http://120.27.23.105/images/icon.png","name":"饮品甜品","pcid":2,"pscid":15},{"icon":"http://120.27.23.105/images/icon.png","name":"大闸蟹","pcid":2,"pscid":16}],"name":"京东生鲜","pcid":"2"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"大米","pcid":3,"pscid":21},{"icon":"http://120.27.23.105/images/icon.png","name":"面粉","pcid":3,"pscid":22},{"icon":"http://120.27.23.105/images/icon.png","name":"杂粮","pcid":3,"pscid":23},{"icon":"http://120.27.23.105/images/icon.png","name":"食用油","pcid":3,"pscid":24},{"icon":"http://120.27.23.105/images/icon.png","name":"调味品","pcid":3,"pscid":25},{"icon":"http://120.27.23.105/images/icon.png","name":"方便速食","pcid":3,"pscid":26},{"icon":"http://120.27.23.105/images/icon.png","name":"有机食品","pcid":3,"pscid":27}],"name":"粮油调味","pcid":"3"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"饮用水","pcid":4,"pscid":28},{"icon":"http://120.27.23.105/images/icon.png","name":"饮料","pcid":4,"pscid":29},{"icon":"http://120.27.23.105/images/icon.png","name":"牛奶乳品","pcid":4,"pscid":30},{"icon":"http://120.27.23.105/images/icon.png","name":"名茶","pcid":4,"pscid":31},{"icon":"http://120.27.23.105/images/icon.png","name":"蜂蜜","pcid":4,"pscid":32}],"name":"水饮茗茶","pcid":"4"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"白酒","pcid":5,"pscid":33},{"icon":"http://120.27.23.105/images/icon.png","name":"葡萄酒","pcid":5,"pscid":34},{"icon":"http://120.27.23.105/images/icon.png","name":"洋酒","pcid":5,"pscid":35},{"icon":"http://120.27.23.105/images/icon.png","name":"啤酒","pcid":5,"pscid":36},{"icon":"http://120.27.23.105/images/icon.png","name":"黄酒","pcid":5,"pscid":37},{"icon":"http://120.27.23.105/images/icon.png","name":"陈年老酒","pcid":5,"pscid":38}],"name":"中外名酒","pcid":"5"}]
     */

    private String msg;
    private String code;
    private List<DataBean> data;

    public String getMsg() {
        return msg;
    }

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

    public String getCode() {
        return code;
    }

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

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * cid : 1
         * list : [{"icon":"http://120.27.23.105/images/icon.png","name":"月饼","pcid":1,"pscid":1},{"icon":"http://120.27.23.105/images/icon.png","name":"坚果炒货","pcid":1,"pscid":2},{"icon":"http://120.27.23.105/images/icon.png","name":"糖巧","pcid":1,"pscid":3},{"icon":"http://120.27.23.105/images/icon.png","name":"休闲零食","pcid":1,"pscid":4},{"icon":"http://120.27.23.105/images/icon.png","name":"肉干肉脯","pcid":1,"pscid":5},{"icon":"http://120.27.23.105/images/icon.png","name":"饼干蛋糕","pcid":1,"pscid":6},{"icon":"http://120.27.23.105/images/icon.png","name":"蜜饯果干","pcid":1,"pscid":7},{"icon":"http://120.27.23.105/images/icon.png","name":"无糖食品","pcid":1,"pscid":8}]
         * name : 休闲零食
         * pcid : 1
         */

        private String cid;
        private String name;
        private String pcid;
        private List<ListBean> list;

        public String getCid() {
            return cid;
        }

        public void setCid(String cid) {
            this.cid = cid;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPcid() {
            return pcid;
        }

        public void setPcid(String pcid) {
            this.pcid = pcid;
        }

        public List<ListBean> getList() {
            return list;
        }

        public void setList(List<ListBean> list) {
            this.list = list;
        }

        public static class ListBean {
            /**
             * icon : http://120.27.23.105/images/icon.png
             * name : 月饼
             * pcid : 1
             * pscid : 1
             */

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

            public String getIcon() {
                return icon;
            }

            public void setIcon(String icon) {
                this.icon = icon;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public int getPcid() {
                return pcid;
            }

            public void setPcid(int pcid) {
                this.pcid = pcid;
            }

            public int getPscid() {
                return pscid;
            }

            public void setPscid(int pscid) {
                this.pscid = pscid;
            }
        }
    }
}
3.adapter类
左侧recyclerview的Adapter
package com.example.monthpractice1.adapter;

import android.content.Context;
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.monthpractice1.R;
import com.example.monthpractice1.bean.CatagoryBean;

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

/**
 * Created by mamiaomiao on 2018/2/27.
 * 图一左侧商品分类列表的适配器
 */

public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.LeftViewHolder> {
    private List<CatagoryBean.DataBean> list = new ArrayList<>();

    private Context context;

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

    @Override
    public LeftViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.text_item, parent,false);

        return new LeftViewHolder(view);
    }

    @Override
    public void onBindViewHolder(LeftViewHolder holder, final int position) {
        //条目点击效果
        if(po==position){
            holder.textView.setTextColor(Color.RED);
            holder.textView.setBackgroundColor(Color.parseColor("#eeeeee"));
        }else {
            holder.textView.setTextColor(Color.BLACK);
            holder.textView.setBackgroundColor(Color.WHITE);
        }
        holder.textView.setText(list.get(position).getName());
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listner.onItemClick(v,list.get(position).getCid());
                po=position;
                notifyDataSetChanged();
            }
        });
    }
private int po=0;
    @Override
    public int getItemCount() {
        return list.size();
    }

    class LeftViewHolder extends RecyclerView.ViewHolder {
        public TextView textView;

        public LeftViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.left_title);
        }
    }
    //设置条目点击事件
    private OnItemClickListner listner;
    public void setClick(OnItemClickListner listner){
        this.listner=listner;
    }
}
右侧recyclerview的adapter
package com.example.monthpractice1.adapter;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
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.monthpractice1.R;
import com.example.monthpractice1.bean.GroupGoodsBean;

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

/**
 * Created by mamiaomiao on 2018/2/27.
 * 图一右侧嵌套recyclerview的适配器
 */

public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.GroupViewHolder> {
    private List<GroupGoodsBean.DataBean> list = new ArrayList<>();
    private Context context;


    public GroupAdapter(Context context ) {
        this.context = context;
    }
    //刷新数据
public void updateData(List<GroupGoodsBean.DataBean> list){
        this.list.clear();
        this.list.addAll(list);
        notifyDataSetChanged();
}
    @Override
    public GroupViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.group_item, null);

        return new GroupViewHolder(view);
    }

    @Override
    public void onBindViewHolder(GroupViewHolder holder, int position) {
        holder.textView.setText(list.get(position).getName());
        //网格recyclerview的数据展示
        holder.recyclerView.setLayoutManager(new GridLayoutManager(context, 3));
        MyAdapter adapter = new MyAdapter(context);
        //为图一嵌套的recyclerview设置适配器
        holder.recyclerView.setAdapter(adapter);
        adapter.addData(list.get(position).getList());

    }


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

    class GroupViewHolder extends RecyclerView.ViewHolder {
        public TextView textView;
        public RecyclerView recyclerView;

        public GroupViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.item_title);
            recyclerView = (RecyclerView) itemView.findViewById(R.id.item_list);
        }
    }
}
右侧recyclerview嵌套recyclerview的适配器
package com.example.monthpractice1.adapter;

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

import com.bumptech.glide.Glide;
import com.example.monthpractice1.R;
import com.example.monthpractice1.bean.CatagoryBean;
import com.example.monthpractice1.bean.GroupGoodsBean;
import com.example.monthpractice1.utils.OkhttpUtil;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * Created by mamiaomiao on 2018/2/27.
 * 图一对应显示图文的适配器
 */

public class MyAdapter extends RecyclerView.Adapter<TextViewHolder> {
    private ArrayList<GroupGoodsBean.DataBean.ListBean> list = new ArrayList<>();
    private Context context;

    public MyAdapter(Context context) {
        this.context = context;
    }
    public void addData(List<GroupGoodsBean.DataBean.ListBean> data){
        this.list.addAll(data);
        notifyDataSetChanged();
    }

    @Override
    public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item, null);
        return new TextViewHolder(view);
    }

    @Override
    public void onBindViewHolder(TextViewHolder holder, int position) {
        holder.textView.setText(list.get(position).getName());
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                OkhttpUtil.doGet("https://www.zhaoapi.cn/product/addCart?uid=12218&pid=1", new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        System.out.println(response.body().string());
                    }
                });
            }
        });
        Glide.with(context).load(list.get(position).getIcon()).into(holder.img);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
class TextViewHolder extends RecyclerView.ViewHolder {
    public TextView textView;
    public ImageView img;

    public TextViewHolder(View itemView){
        super(itemView);
        textView=(TextView)itemView.findViewById(R.id.mytitle);
        img=(ImageView)itemView.findViewById(R.id.myimg);
    }

}

}
点击事件(recyclerview点击事件需要自定义)
package com.example.monthpractice1.adapter;

import android.view.View;

/**
 * Created by mamiaomiao on 2018/2/27.
 */

public interface OnItemClickListner {
    void onItemClick(View view,int cid);
}
4.contract包
 
IShowCardModel
package com.example.monthpractice1.contract;

import com.example.monthpractice1.bean.CatagoryBean;
import com.example.monthpractice1.bean.GroupGoodsBean;
import com.example.monthpractice1.utils.GsonObjectCallback;

/**
 * Created by mamiaomiao on 2018/2/27.
 * model层接口,用来操作数据,从网络获取数据;根据提供的接口分析,图一页面需要从网络请求两个接口,也就是获取数据的来源有两个,那就在model对应的接口里定义两个方法;
 */

public interface IShowCardModel {
    //请求商品子分类类别的数据接口,显示右侧列表
    void getRightData(String url, GsonObjectCallback<GroupGoodsBean> callback);
    //请求商品总分类接口,用于在图一的左侧列表上显示
    void getGoodsCard(String url, GsonObjectCallback<CatagoryBean> callback);
}
IShowCardView
 
package com.example.monthpractice1.contract;

import com.example.monthpractice1.bean.CatagoryBean;
import com.example.monthpractice1.bean.GroupGoodsBean;

import java.util.List;

/**
 * Created by mamiaomiao on 2018/2/27.
 * view层的接口,分析图一效果图可知,由左右两个列表组成;左侧是一个垂直方向的recyclerview(item只有文本)
 * ,右侧也是一个垂直方向的列表(item包括一个文本+网格列表(item包括一个图片+文本));
 * 所以需要用到两个方法来做此两个view的数据显示;
 */

public interface IShowCardView {
    //给右侧list展示数据(给右侧recyclerview设置adapter并加载数据)
    void showRightData(List<GroupGoodsBean.DataBean> data);

    //给左侧list展示数据(给左侧recyclerview设置adapter并加载数据)
    void showCardData(List<CatagoryBean.DataBean> data);

    //报错信息的展示
    void showError(String error);
}
5.model包
ShowCardModel
package com.example.monthpractice1.model;

import com.example.monthpractice1.bean.CatagoryBean;
import com.example.monthpractice1.bean.GroupGoodsBean;
import com.example.monthpractice1.contract.IShowCardModel;
import com.example.monthpractice1.utils.GsonObjectCallback;
import com.example.monthpractice1.utils.OkhttpUtil;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * Created by mamiaomiao on 2018/2/27.
 * model负责  数据   处理;
 */

public class ShowCardModel implements IShowCardModel {
    //请求商品分类接口
    @Override
    public void getGoodsCard(String url,GsonObjectCallback callback) {
        OkhttpUtil.doGet(url, callback);
    }
//请求商品 子 分类的网络接口
    @Override
    public void getRightData(String url, GsonObjectCallback<GroupGoodsBean> callback) {
        OkhttpUtil.doGet(url,callback);
    }
}
6.presenter包
ShowGoodsPresenter
package com.example.monthpractice1.presenter;

import com.example.monthpractice1.bean.CatagoryBean;
import com.example.monthpractice1.bean.GroupGoodsBean;
import com.example.monthpractice1.contract.IShowCardView;
import com.example.monthpractice1.model.ShowCardModel;
import com.example.monthpractice1.utils.GsonObjectCallback;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.List;

import okhttp3.Call;

/**
 * Created by mamiaomiao on 2018/2/27.
 * presenter负责业务逻辑处理,是view层与model层的纽带;
 */

public class ShowGoodsPresenter {
    //防止内存泄漏,将view的对象使用弱引用来管理
    private WeakReference<IShowCardView> reference;
    private ShowCardModel model;

    //presenter类构造方法,获取model类实例;
    public ShowGoodsPresenter() {
        model = new ShowCardModel();
    }

    public void attachView(IShowCardView view) {
        reference = new WeakReference<IShowCardView>(view);
    }

    public void detachView(IShowCardView view) {
        if (reference != null) {
            reference.clear();
            reference = null;
        }
    }

    //presenter类里自定义的方法,实现业务逻辑
    public void getGoodsList() {
        //获取图一左侧分类列表数据并展示
        model.getGoodsCard("https://www.zhaoapi.cn/product/getCatagory", new GsonObjectCallback<CatagoryBean>() {
            @Override
            public void onUi(CatagoryBean o) {
                //图一左侧分类列表加载完成以后,右侧默认显示第一个分类对应的商品子分类列表
                if (o != null && o.getData() != null) {
                    List<CatagoryBean.DataBean> bean = o.getData();
                    if (bean != null) {
                        //reference.get()获取view层对应接口的实例
                        //显示左侧列表数据
                        reference.get().showCardData(bean);
                        //如果左侧数据不为空,右侧默认显示对应左侧第一条数据的子分类;
                        if (bean.size() > 0) {
                            getRightData(bean.get(0).getCid());
                        }
                    } else {
                        reference.get().showError("数据为空");
                    }
                }
            }

            @Override
            public void onFailed(Call call, IOException e) {
                reference.get().showError(e.getMessage());
            }
        });

    }

    //获取图一右侧列表数据并展示
    public void showRightList(int cid) {
        getRightData(cid);
    }

    //请求右侧列表数据
    private void getRightData(int cid) {
        model.getRightData("https://www.zhaoapi.cn/product/getProductCatagory?cid="
                + cid, new GsonObjectCallback<GroupGoodsBean>() {
            @Override
            public void onUi(GroupGoodsBean groupGoodsBean) {
                if (groupGoodsBean != null && groupGoodsBean.getData() != null) {
                    reference.get().showRightData(groupGoodsBean.getData());
                }
            }

            @Override
            public void onFailed(Call call, IOException e) {

            }
        });
    }


}
7.view包
MainActivity
package com.example.monthpractice1.view;

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

import com.example.monthpractice1.R;
import com.example.monthpractice1.adapter.GroupAdapter;
import com.example.monthpractice1.adapter.LeftAdapter;
import com.example.monthpractice1.adapter.OnItemClickListner;
import com.example.monthpractice1.bean.CatagoryBean;
import com.example.monthpractice1.bean.GroupGoodsBean;
import com.example.monthpractice1.contract.IShowCardView;
import com.example.monthpractice1.presenter.ShowGoodsPresenter;

import java.util.List;


public class MainActivity extends AppCompatActivity implements IShowCardView {
    private RecyclerView leftList, rightList;
    private LeftAdapter adapter;
    private GroupAdapter groupAdapter;
    private ShowGoodsPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        leftList = (RecyclerView) findViewById(R.id.left_list);
        rightList = (RecyclerView) findViewById(R.id.right_list);
        //设置布局管理器
        leftList.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        rightList.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        //初始化右侧列表对应的adapter,设置给右侧列表
        groupAdapter = new GroupAdapter(MainActivity.this);
        rightList.setAdapter(groupAdapter);
        //实例化presenter;
        presenter = new ShowGoodsPresenter();
        //初始化presenter对应的view
        presenter.attachView(this);
        //开始调用presenter内定义的方法,展示左侧列表数据,并更新显示右侧列表数据;
        presenter.getGoodsList();

    }

    @Override
    public void showRightData(List<GroupGoodsBean.DataBean> data) {
        groupAdapter.updateData(data);

    }

    //展示左侧列表
    @Override
    public void showCardData(List<CatagoryBean.DataBean> data) {
        LeftAdapter adapter = new LeftAdapter(MainActivity.this, data);
        leftList.setAdapter(adapter);
        adapter.setClick(new OnItemClickListner() {
            @Override
            public void onItemClick(View view, int cid) {
                //左侧列表的条目点击事件;
                presenter.showRightList(cid);
            }
        });
    }

    @Override
    public void showError(String error) {
        Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detachView(this);
    }
}
二.点击右侧recyclerview子条目跳转到商品列表页面(在右侧recyclerview的子Adapter
内进行跳转页面)

1.子Adapter内进行点击跳转并传值
 
package com.example.monthpractice1.adapter;

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

import com.bumptech.glide.Glide;
import com.example.monthpractice1.R;
import com.example.monthpractice1.bean.GroupGoodsBean;
import com.example.monthpractice1.view.SecondListActivity;

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

/**
 * Created by mamiaomiao on 2018/2/27.
 * 图一对应显示图文的适配器
 */

public class MyAdapter extends RecyclerView.Adapter<TextViewHolder> {
    private ArrayList<GroupGoodsBean.DataBean.ListBean> list = new ArrayList<>();
    private Context context;

    public MyAdapter(Context context) {
        this.context = context;
    }

    public void addData(List<GroupGoodsBean.DataBean.ListBean> data) {
        this.list.addAll(data);
        notifyDataSetChanged();
    }

    @Override
    public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final View view = LayoutInflater.from(context).inflate(R.layout.item, null);
        final TextViewHolder holder = new TextViewHolder(view);
        //为图文item添加条目点击事件
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //方式一:直接点击跳转
                context.startActivity(new Intent(context, SecondListActivity.class)
                        .putExtra("pscid", list.get(holder.getLayoutPosition()).getPscid()));

            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(TextViewHolder holder, int position) {

        holder.textView.setText(list.get(position).getName());
        Glide.with(context).load(list.get(position).getIcon()).into(holder.img);
    }

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


}
2.页面xml布局
 
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
<com.jcodecraeer.xrecyclerview.XRecyclerView
    android:id="@+id/xlist"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</android.support.constraint.ConstraintLayout>
itme布局
 
<?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="horizontal"
    android:padding="10dp">

    <ImageView
        android:id="@+id/item_goods_img"
        android:layout_width="80dp"
        android:layout_height="80dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="20dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/item_goods_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/item_goods_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp" />

        <TextView
            android:id="@+id/item_goods_pricenow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textColor="#f00" />


    </LinearLayout>
</LinearLayout>
3.Adapter
 
package com.example.monthpractice1.adapter;

import android.content.Context;
import android.graphics.Paint;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.monthpractice1.R;
import com.example.monthpractice1.bean.GoodsBean;

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

/**
 * Created by mamiaomiao on 2018/2/28.
 * 图二列表展示对应的适配器
 */

public class GoodsAdapter extends RecyclerView.Adapter<GoodsAdapter.GoodsViewHolder> {
    private Context context;
    private List<GoodsBean.DataBean> data = new ArrayList<>();

    public GoodsAdapter(Context context) {
        this.context = context;
    }

    //刷新列表数据
    public void updateList(List<GoodsBean.DataBean> data) {
        this.data.clear();
        addList(data);
    }

    //加载下一页数据
    public void addList(List<GoodsBean.DataBean> data) {
        this.data.addAll(data);
        notifyDataSetChanged();
    }

    @Override
    public GoodsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_goods_list, parent, false);
        GoodsViewHolder holder = new GoodsViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(GoodsViewHolder holder, int position) {
//设置item显示的数据
        holder.title.setText(data.get(position).getTitle());
        holder.price.setText("原价:¥"+data.get(position).getPrice());
        holder.price.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG); //中划线
        //holder.pricenow.setText("优惠价:¥"+data.get(position).getBargainPrice());
   holder.pricenow.setText(String.format(context.getString(R.string.goods_price),data.get(position).getBargainPrice()+""));
    //设置图片
        String url=data.get(position).getImages();
        String[] urls=url.split("\\|");
        if(urls!=null&&urls.length>0){
            url=urls[0];
        }
        Glide.with(context).load(url).into(holder.img);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class GoodsViewHolder extends RecyclerView.ViewHolder {
        public TextView title, price, pricenow;
        public ImageView img;

        public GoodsViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.item_goods_title);
            price = (TextView) itemView.findViewById(R.id.item_goods_price);
            pricenow = (TextView) itemView.findViewById(R.id.item_goods_pricenow);
            img = (ImageView) itemView.findViewById(R.id.item_goods_img);
        }
    }

}
4.bean
 
package com.example.monthpractice1.bean;

import java.util.List;

/**
 * Created by mamiaomiao on 2018/2/28.
 */

public class GoodsBean {

    /**
     * msg : 请求成功
     * code : 0
     * data : [{"bargainPrice":22.9,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":2,"pid":24,"price":288,"pscid":2,"salenum":90,"sellerid":1,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":1,"pid":25,"price":399,"pscid":2,"salenum":100,"sellerid":2,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":0,"pid":26,"price":88,"pscid":2,"salenum":777,"sellerid":3,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":1,"pid":27,"price":488,"pscid":2,"salenum":666,"sellerid":4,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":0,"pid":28,"price":599,"pscid":2,"salenum":555,"sellerid":5,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":2,"pid":29,"price":588,"pscid":2,"salenum":444,"sellerid":6,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":1,"pid":30,"price":688,"pscid":2,"salenum":333,"sellerid":7,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":0,"pid":31,"price":788,"pscid":2,"salenum":222,"sellerid":8,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":1,"pid":32,"price":888,"pscid":2,"salenum":0,"sellerid":9,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"bargainPrice":22.9,"createtime":"2017-10-03T23:43:53","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","itemtype":0,"pid":33,"price":988,"pscid":2,"salenum":0,"sellerid":10,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"}]
     * page : 1
     */

    private String msg;
    private String code;
    private String page;
    private List<DataBean> data;

    public String getMsg() {
        return msg;
    }

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

    public String getCode() {
        return code;
    }

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

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * bargainPrice : 22.9
         * createtime : 2017-10-14T21:48:08
         * detailUrl : https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends
         * images : https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg
         * itemtype : 2
         * pid : 24
         * price : 288.0
         * pscid : 2
         * salenum : 90
         * sellerid : 1
         * subhead : 三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》
         * title : 三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋
         */

        private double bargainPrice;
        private String createtime;
        private String detailUrl;
        private String images;
        private int itemtype;
        private int pid;
        private double price;
        private int pscid;
        private int salenum;
        private int sellerid;
        private String subhead;
        private String title;

        public double getBargainPrice() {
            return bargainPrice;
        }

        public void setBargainPrice(double bargainPrice) {
            this.bargainPrice = bargainPrice;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        public String getDetailUrl() {
            return detailUrl;
        }

        public void setDetailUrl(String detailUrl) {
            this.detailUrl = detailUrl;
        }

        public String getImages() {
            return images;
        }

        public void setImages(String images) {
            this.images = images;
        }

        public int getItemtype() {
            return itemtype;
        }

        public void setItemtype(int itemtype) {
            this.itemtype = itemtype;
        }

        public int getPid() {
            return pid;
        }

        public void setPid(int pid) {
            this.pid = pid;
        }

        public double getPrice() {
            return price;
        }

        public void setPrice(double price) {
            this.price = price;
        }

        public int getPscid() {
            return pscid;
        }

        public void setPscid(int pscid) {
            this.pscid = pscid;
        }

        public int getSalenum() {
            return salenum;
        }

        public void setSalenum(int salenum) {
            this.salenum = salenum;
        }

        public int getSellerid() {
            return sellerid;
        }

        public void setSellerid(int sellerid) {
            this.sellerid = sellerid;
        }

        public String getSubhead() {
            return subhead;
        }

        public void setSubhead(String subhead) {
            this.subhead = subhead;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }
    }
}
5.view
 
package com.example.monthpractice1.contract;

import com.example.monthpractice1.bean.GoodsBean;

import java.util.List;

/**
 * Created by mamiaomiao on 2018/2/28.
 * 图二view接口
 */

public interface IGoodsListView {
    void showGoodsList(List<GoodsBean.DataBean> data);
}
6.model
 
package com.example.monthpractice1.model;

import com.example.monthpractice1.bean.GoodsBean;
import com.example.monthpractice1.utils.GsonObjectCallback;
import com.example.monthpractice1.utils.OkhttpUtil;

/**
 * Created by mamiaomiao on 2018/2/28.
 * 图二对应的model层,获取子分类商品列表数据
 */

public class GoodsListShowModel {

    public void getGoodsList(String url, GsonObjectCallback<GoodsBean> callback) {
        OkhttpUtil.doGet(url, callback);

    }
}
7.persenter

package com.example.monthpractice1.presenter;

import com.example.monthpractice1.bean.GoodsBean;
import com.example.monthpractice1.contract.IGoodsListView;
import com.example.monthpractice1.model.GoodsListShowModel;
import com.example.monthpractice1.utils.GsonObjectCallback;

import java.io.IOException;
import java.lang.ref.WeakReference;

import okhttp3.Call;

/**
 * Created by mamiaomiao on 2018/2/28.
 * 对应图二业务逻辑层presenter
 */

public class GoodsListPresenter {
    private GoodsListShowModel model;
    private WeakReference<IGoodsListView> reference;

    //构造方法
    public GoodsListPresenter() {
        model = new GoodsListShowModel();
    }
//关联view
    public void attachView(IGoodsListView view){
        reference=new WeakReference<IGoodsListView>(view);
    }
    //防止内存泄漏,创建view解绑
    public void detachView(){
        if(reference!=null){
            reference.clear();
            reference=null;
        }
    }

    public void getData(int pscid, int page) {
        model.getGoodsList("https://www.zhaoapi.cn/product/getProducts?pscid=" + pscid + "&page=" + page, new GsonObjectCallback<GoodsBean>() {
            @Override
            public void onUi(GoodsBean goodsBean) {
                //数据请求成功,显示到view上
            reference.get().showGoodsList(goodsBean.getData());
            }

            @Override
            public void onFailed(Call call, IOException e) {

            }
        });
    }

}
8.Activity
package com.example.monthpractice1.view;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;

import com.example.monthpractice1.R;
import com.example.monthpractice1.adapter.GoodsAdapter;
import com.example.monthpractice1.bean.GoodsBean;
import com.example.monthpractice1.contract.IGoodsListView;
import com.example.monthpractice1.presenter.GoodsListPresenter;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.List;

/**
 * Created by mamiaomiao on 2018/2/28.
 */

public class SecondListActivity extends Activity implements IGoodsListView {
    private XRecyclerView recyclerView;
    private GoodsAdapter adapter;
    private GoodsListPresenter presenter;
    private int pscid;
    private int page = 1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        //从上一个列表页(图一)获取pscid
        Intent intent = getIntent();
        if (intent != null) {
            pscid = intent.getIntExtra("pscid", 0);
        }
        //隐藏左侧列表,只显示右侧列表
        //findViewById(R.id.left_list).setVisibility(View.GONE);
        recyclerView = (XRecyclerView) findViewById(R.id.xlist);
        adapter = new GoodsAdapter(SecondListActivity.this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(SecondListActivity.this));
//实例化presenter,关联view
        presenter = new GoodsListPresenter();
        presenter.attachView(this);
        //通过presenter请求数据并显示;
        if (pscid > 0) {
            presenter.getData(pscid, page);
        }

       
    }

    @Override
    public void showGoodsList(List<GoodsBean.DataBean> data) {
        
        if (page > 1) {
            //显示添加数据
            adapter.addList(data);
        } else {
            adapter.updateList(data);
        }

    }
}
三,点击图片,跳转到商品详情页面
 
1.在商品列表的Adapter进行跳转
 
package com.example.tangxueqin.demo_yuekao.adapter;

import android.content.Context;
import android.content.Intent;
import android.graphics.Paint;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.tangxueqin.demo_yuekao.R;
import com.example.tangxueqin.demo_yuekao.bean.GoodsBean;
import com.example.tangxueqin.demo_yuekao.view.CommodityDetailsActivity;

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

/**
 * Created by tangxueqin on 2018/2/28.
 */
public class GoodsAdapter extends RecyclerView.Adapter<GoodsAdapter.GoodsViewHoder> {
    private Context context;

    private List<GoodsBean.DataBean> list=new ArrayList<>();

    public GoodsAdapter(Context context) {
        this.context = context;
    }

    //下拉刷新
    public void updateList(List<GoodsBean.DataBean> list){
       this.list.clear();
        addList(list);
    }
    //上拉加载
    public void addList(List<GoodsBean.DataBean> list){
      this.list.addAll(list);
        notifyDataSetChanged();
    }
    @Override
    public GoodsViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_goods, null);
        GoodsViewHoder hoder=new GoodsViewHoder(view);

        return hoder;
    }

    @Override
    public void onBindViewHolder(GoodsViewHoder holder, final int position) {

        holder.goods_titel.setText(list.get(position).getTitle());
        holder.goods_price.setText("原价:¥"+list.get(position).getPrice());
        //中划线
        holder.goods_price.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
        holder.goods_zqprice.setText("优惠价:¥"+list.get(position).getBargainPrice());
        //设置图片
        String images = list.get(position).getImages();
        String[] split = images.split("\\|");
        if (split!=null&&split.length>0) {
        images=split[0];
        }
        Glide.with(context).load(images).into(holder.goods_img);
        holder.goods_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //页面跳转
                Intent intent=new Intent(context, CommodityDetailsActivity.class);

                intent.putExtra("list", list.get(position).getImages());
                intent.putExtra("titel", list.get(position).getTitle());
                intent.putExtra("price", list.get(position).getPrice());
                intent.putExtra("zqprice", list.get(position).getBargainPrice());

                context.startActivity(intent);
            }
        });
    }

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

    class GoodsViewHoder extends RecyclerView.ViewHolder{
        private ImageView goods_img;
        private TextView goods_titel,goods_price,goods_zqprice;
        public GoodsViewHoder(View itemView) {
            super(itemView);
             goods_img =(ImageView) itemView.findViewById(R.id.goods_img);
             goods_titel =(TextView) itemView.findViewById(R.id.goods_titel);
             goods_price =(TextView) itemView.findViewById(R.id.goods_price);
             goods_zqprice =(TextView) itemView.findViewById(R.id.goods_zqprice);


        }
    }
}
2.util
(1.需要在Manifast.xml中注册:
 
<application
    android:name=".utils.MyApplication"

package com.example.tangxueqin.demo_yuekao.utils;

import android.app.Application;

/**
 * Created by tangxueqin on 2018/3/2.
 */
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //初使化
        ImageloaderUtil.initConfig(this);

    }
}
(2

package com.example.tangxueqin.demo_yuekao.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Environment;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.io.File;

/**
 * Created by tangxueqin on 2018/3/2.
 */
public class ImageloaderUtil {
    /**
     * ImageLoader的配置
     * @param context
     */
    public static void initConfig(Context context) {
        //配置
//        File cacheFile=context.getExternalCacheDir();
        File cacheFile= new File(Environment.getExternalStorageDirectory()+"/"+"imgages");

        ImageLoaderConfiguration config=new ImageLoaderConfiguration.Builder(context)
                .memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽
                .threadPoolSize(2)//线程池的数量
                .threadPriority(4)
                .memoryCacheSize(2*1024*1024)//设置内存缓存区大小
                .diskCacheSize(20*1024*1024)//设置sd卡缓存区大小
                .diskCache(new UnlimitedDiskCache(cacheFile))//自定义缓存目录
                .writeDebugLogs()//打印日志内容
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理
                .build();

        ImageLoader.getInstance().init(config);

    }

    /**
     * 获取图片设置类
     * @return
     */
    public static DisplayImageOptions getImageOptions(){

        DisplayImageOptions optionsoptions=new DisplayImageOptions.Builder()
                .cacheInMemory(true)//使用内存缓存
                .cacheOnDisk(true)//使用磁盘缓存
                .bitmapConfig(Bitmap.Config.RGB_565)//设置图片格式
                .build();

        return optionsoptions;

    }
}
(3

package com.example.tangxueqin.demo_yuekao.utils;
import android.content.Context;
import android.widget.ImageView;

import com.youth.banner.loader.ImageLoader;

/**
 * Created by e531 on 2017/11/17.
 */
public class MyBannerLoader extends ImageLoader {
    @Override
    public void displayImage(Context context, Object path, ImageView imageView) {
        com.nostra13.universalimageloader.core.ImageLoader uImageLoader= com.nostra13.universalimageloader.core.ImageLoader.getInstance();
        //path:表示路径 imageview:显示的控件
        uImageLoader.displayImage(path.toString(),imageView,ImageloaderUtil.getImageOptions());
    }
}
3.Activity
 
package com.example.tangxueqin.demo_yuekao.view;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.TextView;

import com.example.tangxueqin.demo_yuekao.R;
import com.example.tangxueqin.demo_yuekao.presenter.GoodsListPresenter;
import com.example.tangxueqin.demo_yuekao.utils.MyBannerLoader;
import com.youth.banner.Banner;

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

public class CommodityDetailsActivity extends AppCompatActivity{

    private Banner banner;

    private GoodsListPresenter presenter;
    private List<String> list;
    private Button btn;
    private TextView text_titel,text_price,text_zqprice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_commodity_details);
        banner = (Banner) findViewById(R.id.my_banner);
        btn = (Button) findViewById(R.id.btn_gouwuche);
        text_titel = (TextView) findViewById(R.id.goods_titel_1);
        text_price= (TextView) findViewById(R.id.goods_price_1);
        text_zqprice = (TextView) findViewById(R.id.goods_zqprice_1);

        final Intent intent = getIntent();
        String images = intent.getStringExtra("list");
        String titel = intent.getStringExtra("titel");
       // int price = intent.getIntExtra("price", 0);
        //int zqprice = intent.getIntExtra("zqprice", 0);


        list = new ArrayList<>();
        String[] split = images.split("\\|");
        if (split!=null&&split.length>0) {
            for (int i=0;i<split.length;i++){
                list.add(split[i]);
            }
        }
        MyBannerLoader myBannerLoader=new MyBannerLoader();
        banner.setImageLoader( myBannerLoader);
        banner.setImages(list);
        banner.start();
        text_titel.setText(titel);
      //  text_price.setText(price);
       // text_zqprice.setText(zqprice);

//        btn.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                Intent intent1=new Intent(CommodityDetailsActivity.this,ShoppingTrolleyActivity.class);
//                startActivity(intent1);
//            }
//        });


    }


}














 







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值