//导入依赖
//Recyclerview是listview的升级版
implementation 'com.android.support:recyclerview-v7:28.0.0'
//okhttp
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
//Glide请求网络图片
implementation 'com.github.bumptech.glide:glide:3.7.0'
implementation 'com.google.code.gson:gson:2.2.4'
//添加权限
<uses-permission android:name="android.permission.INTERNET"/>
//主页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
/>
<ScrollView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="8"
>
<LinearLayout
android:id="@+id/linea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
></LinearLayout>
</ScrollView>
</LinearLayout>
//左边布局
<?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="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="服务费"
android:layout_gravity="center"
/>
</LinearLayout>
//右边布局
<?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="match_parent"
android:orientation="vertical"
>
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/ic_launcher_background"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="吊袜带"
android:layout_marginLeft="20dp"
/>
</LinearLayout>
//左边解析后的bean类
package com.example.fenlei2.bean;
import java.util.List;
public class LeftBean {
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;
}
}
}
//右边解析数据到bean类
package com.example.fenlei2.bean;
import java.util.List;
public class RightBean {
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;
}
}
}
}
//左边数据adapter
package com.example.fenlei2.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.fenlei2.R;
import com.example.fenlei2.bean.LeftBean;
import java.util.ArrayList;
import java.util.List;
public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.ViewHolder> {
Context mContext;
List<LeftBean.DataBean> list;
public LeftAdapter(Context context) {
mContext = context;
list = new ArrayList<>();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = View.inflate(mContext, R.layout.left_text, null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
viewHolder.text.setText(list.get(i).getName());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mOnLeftadapter != null){
mOnLeftadapter.returnid(list.get(i).getCid()+"");
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public void setData(List<LeftBean.DataBean> data) {
list = data;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView text;
public ViewHolder(@NonNull View itemView) {
super(itemView);
text = itemView.findViewById(R.id.text);
}
}
//定义接口返回id
public interface onLeftadapter{
void returnid(String s);
}
public onLeftadapter mOnLeftadapter;
public void setOnLeftadapter(onLeftadapter onLeftadapter){
this.mOnLeftadapter = onLeftadapter;
}
}
//右边数据adapter
package com.example.fenlei2.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.fenlei2.R;
import com.example.fenlei2.bean.RightBean;
import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.List;
public class RightAdapter extends RecyclerView.Adapter<RightAdapter.ViewHolder> {
Context mContext;
List<RightBean.DataBean.ListBean> list;
public RightAdapter(Context context) {
mContext = context;
list = new ArrayList<>();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = View.inflate(mContext,R.layout.right_text,null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.text.setText(list.get(i).getName());
Glide.with(mContext).load(list.get(i).getIcon()).into(viewHolder.image);
}
@Override
public int getItemCount() {
return list.size();
}
public void setData(List<RightBean.DataBean.ListBean> list) {
this.list.addAll(list);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView text;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
text = itemView.findViewById(R.id.text);
}
}
}
//封装okhttp
package com.example.fenlei2.utils;
import android.os.Handler;
import android.os.Looper;
import com.example.fenlei2.LoggingInterceptor;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttps {
Handler handler;
private final OkHttpClient mOkHttpClient;
private static OkHttps mOkHttps;
private OkHttps() {
handler = new Handler(Looper.getMainLooper());
LoggingInterceptor loggingInterceptor = new LoggingInterceptor(); //日志拦截器
mOkHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor) //设置日志拦截器
.connectTimeout(5000, TimeUnit.MILLISECONDS)
.readTimeout(5000,TimeUnit.MILLISECONDS)
.writeTimeout(5000,TimeUnit.MILLISECONDS)
.build();
}
public static OkHttps getInstance(){
if (mOkHttps==null){
synchronized (OkHttps.class){
if (mOkHttps==null){
return mOkHttps=new OkHttps();
}
}
}
return mOkHttps;
}
public interface OkCallback{
void onResponse(String json);
void onFailure(Exception e);
}
public void doPost(String url, Map<String,String> map, final OkCallback okCallback){
FormBody.Builder builder = new FormBody.Builder();
if (map!=null){
for (String key:map.keySet()){
builder.add(key,map.get(key));
}
}
FormBody formBody = builder.build();
final Request request = new Request.Builder()
.post(formBody)
.url(url)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
if (okCallback!=null){
handler.post(new Runnable() {
@Override
public void run() {
okCallback.onFailure(e);
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
if (response!=null && response.isSuccessful()){
final String json = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
if (okCallback!=null){
okCallback.onResponse(json);
return;
}
}
});
}
}catch (IOException e){
e.printStackTrace();
}
if (okCallback!=null){
okCallback.onFailure(new Exception("网络异常"));
}
}
});
}
public void doGet(String url, final OkCallback okCallback){
Request request = new Request.Builder()
.url(url)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
if (okCallback != null) {
//切换到主线程
handler.post(new Runnable() {
@Override
public void run() {
okCallback.onFailure(e);
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
if (response != null && response.isSuccessful()) {
final String json = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
if (okCallback != null) {
okCallback.onResponse(json);
}
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
//拦截器
package com.example.fenlei2;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* 日志拦截器类,请求来了,先在这里进行处理,可以得到发请求到得到请求消耗多久的时间
* 作用:可以排查网络请求速度慢的根本原因
* 1.有可能是我们在请求网络时,客户端写了一堆业务逻辑
* 2.有可能是服务器端,写的有问题
* 3.有可能就是网速不给力
*/
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//拿到Request对象
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(" request = " + String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
//拿到Response对象
Response response = chain.proceed(request);
long t2 = System.nanoTime();
//得出请求网络,到得到结果,中间消耗了多长时间
System.out.println("response " + String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
//创建presenter层
package com.example.fenlei2.presenter;
import com.example.fenlei2.bean.RightBean;
import com.example.fenlei2.utils.OkHttps;
import com.google.gson.Gson;
import java.util.List;
import java.util.Map;
public class Hzjpresenter {
//把接口当参数
public void hzjgetDate(String page, Map<String,String> map, final Getdopost getdopost){
OkHttps.getInstance().doPost(page, map, new OkHttps.OkCallback() {
@Override
public void onResponse(String json) {
RightBean rightBean = new Gson().fromJson(json, RightBean.class);
List<RightBean.DataBean> data = rightBean.getData();
getdopost.success(data);
}
@Override
public void onFailure(Exception e) {
}
});
}
public interface Getdopost{
//成功方法
void success(List<RightBean.DataBean> data);
//失败
void failed();
}
}
//mainactivity
package com.example.fenlei2;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.fenlei2.adapter.LeftAdapter;
import com.example.fenlei2.adapter.RightAdapter;
import com.example.fenlei2.bean.LeftBean;
import com.example.fenlei2.bean.RightBean;
import com.example.fenlei2.presenter.Hzjpresenter;
import com.example.fenlei2.utils.OkHttps;
import com.google.gson.Gson;
import org.w3c.dom.Text;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private RecyclerView recy;
private LinearLayout linea;
LeftAdapter mLeftAdapter;
RightAdapter mRightAdapter;
Hzjpresenter mHzjpresenter;
//左边接口
String url = "http://www.zhaoapi.cn/product/getCatagory";
//右边接口
String page = "http://www.zhaoapi.cn/product/getProductCatagory";
//定一个变量
String nid = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
//左边请求封装类进行展示 使用doget方法
OkHttps.getInstance().doGet(url, new OkHttps.OkCallback() {
@Override
public void onResponse(String json) {
//进行gson解析
LeftBean leftBean = new Gson().fromJson(json, LeftBean.class);
//new 一个实例adapter
mLeftAdapter = new LeftAdapter(MainActivity.this);
//解析完的数据进行获取
List<LeftBean.DataBean> data = leftBean.getData();
//添加到adapter 设置一个方法
mLeftAdapter.setData(data);
//设置适配器
recy.setAdapter(mLeftAdapter);
//recycleview使用LinearLayout布局
recy.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));
//调用左边设配器里面 设置的接口把id传过去
mLeftAdapter.setOnLeftadapter(new LeftAdapter.onLeftadapter() {
@Override
public void returnid(String s) {
//让变量等于传过来id = s
nid = s;
//在创建一个方法展示右边数据
getData();
}
});
}
@Override
public void onFailure(Exception e) {
}
});
}
private void getData() {
//创建map
Map<String,String> map = new HashMap<>();
//map.put 把接口cid 和传过来的id传进去
map.put("cid",nid);
//new 一个presenter层对象
mHzjpresenter = new Hzjpresenter();
//调用presenter层里面的方法
mHzjpresenter.hzjgetDate(page, map, new Hzjpresenter.Getdopost() {
@Override
public void success(List<RightBean.DataBean> data) {
//清除已有的缓存
linea.removeAllViews();
//进行for循环展示右边数据
for (int i = 0; i <data.size() ; i++) {
RightBean.DataBean dataBean = data.get(i);
List<RightBean.DataBean.ListBean> list = dataBean.getList();
//创建一个新的textview
TextView textView = new TextView(MainActivity.this);
//把它设置为请求的name
textView.setText(list.get(i).getName());
//新建一个recycleview
RecyclerView recyclerView = new RecyclerView(MainActivity.this);
mRightAdapter = new RightAdapter(MainActivity.this);
//让新建的recycleview设置网格布局
recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3));
//在rightadapter里添加list
mRightAdapter.setData(list);
//设置适配器
recyclerView.setAdapter(mRightAdapter);
//更新数据
mRightAdapter.notifyDataSetChanged();
//添加textview
linea.addView(textView);
//添加recycleview
linea.addView(recyclerView);
}
}
@Override
public void failed() {
}
});
}
private void initView() {
recy = (RecyclerView) findViewById(R.id.recy);
linea = (LinearLayout) findViewById(R.id.linea);
}
}