仿京东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.RecyclerViewandroid:id="@+id/left_list"android:layout_width="100dp"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView><android.support.v7.widget.RecyclerViewandroid: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"><TextViewandroid: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">
<TextViewandroid:id="@+id/item_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"/><android.support.v7.widget.RecyclerViewandroid: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"><ImageViewandroid:id="@+id/myimg"android:layout_width="match_parent"android:layout_height="60dp" /><TextViewandroid: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();//创建RequestRequest 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));}//创建RequestRequest 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);//请求失败@Overridepublic void onFailure(final Call call, final IOException e) {handler.post(new Runnable() {@Overridepublic void run() {onFailed(call, e);}});}//请求json 并直接返回泛型的对象 主线程处理@Overridepublic 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() {@Overridepublic 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;}@Overridepublic LeftViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.text_item, parent,false);return new LeftViewHolder(view);}@Overridepublic 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() {@Overridepublic void onClick(View v) {listner.onItemClick(v,list.get(position).getCid());po=position;notifyDataSetChanged();}});}
private int po=0;@Overridepublic 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();
}@Overridepublic GroupViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.group_item, null);return new GroupViewHolder(view);}@Overridepublic 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());}@Overridepublic 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();}@Overridepublic TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item, null);return new TextViewHolder(view);}@Overridepublic void onBindViewHolder(TextViewHolder holder, int position) {holder.textView.setText(list.get(position).getName());holder.textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {OkhttpUtil.doGet("https://www.zhaoapi.cn/product/addCart?uid=12218&pid=1", new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic 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);}@Overridepublic 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 {//请求商品分类接口@Overridepublic void getGoodsCard(String url,GsonObjectCallback callback) {OkhttpUtil.doGet(url, callback);}
//请求商品 子 分类的网络接口@Overridepublic 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>() {@Overridepublic 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("数据为空");}}}@Overridepublic 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>() {@Overridepublic void onUi(GroupGoodsBean groupGoodsBean) {if (groupGoodsBean != null && groupGoodsBean.getData() != null) {reference.get().showRightData(groupGoodsBean.getData());}}@Overridepublic 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;@Overrideprotected 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对应的viewpresenter.attachView(this);//开始调用presenter内定义的方法,展示左侧列表数据,并更新显示右侧列表数据;presenter.getGoodsList();}@Overridepublic void showRightData(List<GroupGoodsBean.DataBean> data) {groupAdapter.updateData(data);}//展示左侧列表@Overridepublic void showCardData(List<CatagoryBean.DataBean> data) {LeftAdapter adapter = new LeftAdapter(MainActivity.this, data);leftList.setAdapter(adapter);adapter.setClick(new OnItemClickListner() {@Overridepublic void onItemClick(View view, int cid) {//左侧列表的条目点击事件;presenter.showRightList(cid);}});}@Overridepublic void showError(String error) {Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();}@Overrideprotected 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();}@Overridepublic 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() {@Overridepublic void onClick(View v) {//方式一:直接点击跳转context.startActivity(new Intent(context, SecondListActivity.class).putExtra("pscid", list.get(holder.getLayoutPosition()).getPscid()));}});return holder;}@Overridepublic void onBindViewHolder(TextViewHolder holder, int position) {holder.textView.setText(list.get(position).getName());Glide.with(context).load(list.get(position).getIcon()).into(holder.img);}@Overridepublic int getItemCount() {return list.size();}}

2.页面xml布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent">
<com.jcodecraeer.xrecyclerview.XRecyclerViewandroid: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"><ImageViewandroid:id="@+id/item_goods_img"android:layout_width="80dp"android:layout_height="80dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="20dp"android:orientation="vertical"><TextViewandroid:id="@+id/item_goods_title"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/item_goods_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp" /><TextViewandroid: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();}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic 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();}
//关联viewpublic 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>() {@Overridepublic void onUi(GoodsBean goodsBean) {//数据请求成功,显示到view上reference.get().showGoodsList(goodsBean.getData());}@Overridepublic 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;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);//从上一个列表页(图一)获取pscidIntent 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,关联viewpresenter = new GoodsListPresenter();presenter.attachView(this);//通过presenter请求数据并显示;if (pscid > 0) {presenter.getData(pscid, page);}}@Overridepublic 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();}@Overridepublic GoodsViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_goods, null);GoodsViewHoder hoder=new GoodsViewHoder(view);return hoder;}@Overridepublic 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() {@Overridepublic 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);}});}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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;@Overrideprotected 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);
//            }
//        });}}


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

  1. 仿京东App分类页面的实现

    今天群里有人问了关于仿京东App分类页面的实现,而我之前正好查过这方面的资料,手上正好有一个demo,正好分享给大家看看,个人觉得效果棒棒哒! 首先来看效果图吧 是不是很6呢,来分析这个demo的主体 ...

  2. JAVA——Okhttp封装工具类

    基本概念 OKhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架. Maven <!--OK HTTP Client--><dependency><grou ...

  3. smobiler仿京东app搜索页面

    京东app搜索界面如下图所示: 完整代码见git :https://github.com/comsmobiler/BlogsCode/blob/master/Source/BlogsCode_Smob ...

  4. kotlin 仿开眼 app 学习 kotlin mvp retrofit rxjava

    Eyepetizer 项目地址:kaikaixue/Eyepetizer  简介:kotlin 仿开眼 app 学习 kotlin mvp retrofit rxjava 更多:作者   提 Bug ...

  5. android高仿京东app

    仿京东app 采用组件化架构 屏幕适配方案可以较好解决多分辨率及同分辨率不同dpi适配: 全新组件化架构升级,相比之前的方案模块间更为解耦且使用更为方便: 本项目为仿京东项目,资源为抓包获取,项目框架 ...

  6. Kotlin-Android开发之开源《新闻APP》基于MVP模式+Retrofit2.0+RxJava1.0+Dagger2框架

    前言:此项目是一个适合刚入门安卓开发的且熟悉Kotlin的练手小项目,基于<Kotlin-Android开发之MVP模式+Retrofit2.0+RxJava1.0+Dagger2框架封装> ...

  7. 使用Jsoup抓取京东图书分类页面图书信息

    一.目的: 1.任务 使用 Jsoup抓取京东图书分类页面的图书信息. 抓取目标分类网址例如:https://list.jd.com/list.html?cat=1713,3259,3330 给与的某 ...

  8. 仿茶馆APP前端页面/UNI-APP编译包仿茶馆的前端

    介绍: 仿茶馆APP前端页面/UNI-APP编译包仿2020版本茶馆的前端 源码为仿茶馆2020年一个版本界面,单UNI-APP编译后的模板,没有VUE(UNI-APP)源码和后台 此套就是模板,不带 ...

  9. HTML前端仿京东静态登录页面

    HTML前端仿京东静态登录页面 很多小伙伴在学习前端静态布局的时候 总是一头雾水不知版图从何构造 今天就写了一篇这个京东登录页面和大家一快学习! <!DOCTYPE html> <h ...

最新文章

  1. mysql 异步api_Hiredis异步API
  2. 10.6监控io性能10.7free命令10.8ps命令10.9查看网络状态10.10linux抓包
  3. java如何确保单线程_java – 任何单线程程序如何成为有效的多线程程序?
  4. 9-Qt6 QString和QChar
  5. pyenv 让 python 版本完美切换
  6. 【LeetCode笔记】114. 二叉树展开为链表(Java、递归)
  7. html中如何华直角坐标系,空间直角坐标系的画法..ppt
  8. ajax注册用户名为空,怎么用ajax和js检测用户名是否合法和不能为空
  9. Deep Learning for 3D Recognition
  10. linux不能上网问题
  11. 计算机网络之网络安全基础
  12. NOR Flash、NAND Flash、SPI Flash、CFI Flash
  13. Java重命名文件的方法_java重命名文件(附道客巴巴文档下载方法)
  14. win10下装黑苹果双系统_win10下安装双系统:黑苹果10.13.5(17F77)教程!
  15. dede服务器建站_「建站篇」如何将本地搭建的织梦站点上传到服务器空间?
  16. PSSP Based on Data Partition and Semi-Random Subspace Method 论文笔记
  17. 网恋背后的骗局:那些被宰杀掉的猪!必看!
  18. 读书笔记 ·《简约至上》第二章 明确认识
  19. JVM简笔—类的加载
  20. 超声图像散斑去噪方法

热门文章

  1. 采用hxd019d传输数据相关
  2. 计算机主板nvme接口,m2和NVME在电脑主板上的接口是一样的吗?求懂得人解答
  3. 2018年如何赚钱?
  4. word2007中如何生成目录
  5. 邀请函 | 2021 ISIG中国产业智能大会,产业数字智能化的年度最大盛会!
  6. linux键盘鼠标不能使用的办法
  7. 2048 控制台版(c实现)
  8. pandas:read_excel()和to_excel函数解析
  9. python摸鱼之掩藏在泥土中的鱼,领导都在夸你勤奋
  10. MATLAB---CAD逐个绘制切线段