权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
依赖
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.jcodecraeer:xrecyclerview:1.5.9'
api 'com.squareup.okhttp3:okhttp:3.9.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.google.code.gson:gson:2.8.2'
布局
mainactivity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.zld.kaoshiday10.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>
text_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:background="#fff"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- <ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:id="@+id/left_img"
/>-->
<TextView
android:id="@+id/left_title"
android:padding="20dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/myimg"
android:layout_width="match_parent"
android:layout_height="60dp" />
<TextView
android:gravity="center"
android:id="@+id/mytitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
group_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" 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>
bean
CatagoryBean
package com.example.zld.kaoshiday10.bean;
import java.util.List;
/**
* Created by zld on 2018/4/20.
*/
public class CatagoryBean {
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;
}
}
}
GroupGoodsBean
package com.example.zld.kaoshiday10.bean;
import java.util.List;
/**
* Created by zld on 2018/4/20.
*/
public class GroupGoodsBean {
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;
}
}
}
}
utils
OkhttpUtil
package com.example.zld.kaoshiday10.utils;
import android.os.Environment;
import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* Created by zld on 2018/4/20.
*/
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()
.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.zld.kaoshiday10.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;
/**
* Created by zld on 2018/4/20.
*/
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);
}
});
}
}
Model
IShowCardModel
package com.example.zld.kaoshiday10.model;
import com.example.zld.kaoshiday10.bean.CatagoryBean;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import com.example.zld.kaoshiday10.utils.GsonObjectCallback;
/**
* Created by zld on 2018/4/20.
*/
public interface IShowCardModel {
void getRightData(String url, GsonObjectCallback<GroupGoodsBean> callback);
void getGoodsCard(String url, GsonObjectCallback<CatagoryBean> callback);
}
ShowCardModel
package com.example.zld.kaoshiday10.model;
import com.example.zld.kaoshiday10.bean.CatagoryBean;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import com.example.zld.kaoshiday10.utils.GsonObjectCallback;
import com.example.zld.kaoshiday10.utils.OkhttpUtil;
/**
* Created by zld on 2018/4/20.
*/
public class ShowCardModel implements IShowCardModel {
@Override
public void getRightData(String url, GsonObjectCallback<GroupGoodsBean> callback) {
OkhttpUtil.doGet(url,callback);
}
@Override
public void getGoodsCard(String url, GsonObjectCallback<CatagoryBean> callback) {
OkhttpUtil.doGet(url,
callback);
}
}
presenter
OnItemClickListner
package com.example.zld.kaoshiday10.presenter;
import android.view.View;
/**
* Created by zld on 2018/4/20.
*/
public interface OnItemClickListner {
void onItemClick(View view, int cid);
}
ShowGoodsPresenter
package com.example.zld.kaoshiday10.presenter;
import com.example.zld.kaoshiday10.bean.CatagoryBean;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import com.example.zld.kaoshiday10.model.ShowCardModel;
import com.example.zld.kaoshiday10.utils.GsonObjectCallback;
import com.example.zld.kaoshiday10.view.IShowCardView;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.List;
import okhttp3.Call;
/**
* Created by zld on 2018/4/20.
*/
public class ShowGoodsPresenter {
private WeakReference<IShowCardView> reference;
private ShowCardModel 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;
}
}
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().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) {
}
});
}
}
view
IShowCardView
package com.example.zld.kaoshiday10.view;
import com.example.zld.kaoshiday10.bean.CatagoryBean;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import java.util.List;
/**
* Created by zld on 2018/4/20.
*/
public interface IShowCardView {
void showRightData(List<GroupGoodsBean.DataBean> data);
void showCardData(List<CatagoryBean.DataBean> data);
void showError(String error);
}
MainActivity
package com.example.zld.kaoshiday10;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.example.zld.kaoshiday10.adapter.GroupAdapter;
import com.example.zld.kaoshiday10.adapter.LeftAdapter;
import com.example.zld.kaoshiday10.bean.CatagoryBean;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import com.example.zld.kaoshiday10.presenter.OnItemClickListner;
import com.example.zld.kaoshiday10.presenter.ShowGoodsPresenter;
import com.example.zld.kaoshiday10.view.IShowCardView;
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 = findViewById(R.id.left_list);
rightList = findViewById(R.id.right_list);
leftList.setLayoutManager(new LinearLayoutManager(MainActivity.this));
rightList.setLayoutManager(new LinearLayoutManager(MainActivity.this));
groupAdapter = new GroupAdapter(MainActivity.this);
rightList.setAdapter(groupAdapter);
presenter = new ShowGoodsPresenter();
presenter.attachView(this);
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);
}
}
adapter
MyAdapter
package com.example.zld.kaoshiday10.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.zld.kaoshiday10.R;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zld on 2018/4/20.
*/
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());
Glide.with(context).load(list.get(position).getIcon()).into(holder.img);
}
@Override
public int getItemCount() {
return list.size();
}
}
TextViewHolder
package com.example.zld.kaoshiday10.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.zld.kaoshiday10.R;
/**
* Created by zld on 2018/4/20.
*/
public 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);
}
}
GroupAdapter
package com.example.zld.kaoshiday10.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.zld.kaoshiday10.R;
import com.example.zld.kaoshiday10.bean.GroupGoodsBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zld on 2018/4/20.
*/
public class GroupAdapter extends RecyclerView.Adapter<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());
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);
}
}
LeftAdapter
package com.example.zld.kaoshiday10.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.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.zld.kaoshiday10.R;
import com.example.zld.kaoshiday10.bean.CatagoryBean;
import com.example.zld.kaoshiday10.presenter.OnItemClickListner;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zld on 2018/4/20.
*/
public class LeftAdapter extends RecyclerView.Adapter<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());
// Glide.with(context).load(list.get(position).getIcon()).into(holder.limg);
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();
}
//设置条目点击事件
private OnItemClickListner listner;
public void setClick(OnItemClickListner listner){
this.listner=listner;
}
}
class LeftViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
// public ImageView limg;
public LeftViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.left_title);
// limg = itemView.findViewById(R.id.left_img);
}
}