首先我们需要两个接口
//用get方式请求
//左侧
public final static String LEFT_API="http://172.17.8.100/small/commodity/v1/findFirstCategory";
//右侧
public final static String RIGHT_API="http://172.17.8.100/small/commodity/v1/findCommodityByKeyword?page=1&count=5&keyword=";
相对的我们也需要2个bean层
public class LeftBean {
public String message;
public String status;
public List<ResultBean> result;
public static class ResultBean {
public String id;
public String name;
}
}
public class RightBean {
public String message;
public String status;
public List<ResultBean> result;
public static class ResultBean {
public int commodityId;
public String commodityName;
public String masterPic;
public int price;
public int saleNum;
}
}
相对的契约类里的方法也需要两个
package jiaoyibo.bawei.com.fenleizhanshi.contract;
import java.util.HashMap;
import jiaoyibo.bawei.com.fenleizhanshi.net.RequestCallBack;
/**
* <p>文件描述:<p>
* <p>作者:JYB<p>
* <p>创建时间:2019/2/22<p>
* <p>更改时间:2019/2/22<p>
* <p>版本号:1<p>
*/
public interface LoadContract {
//p层
public abstract class LloadPresenter{
public abstract void LeftPesenter(HashMap<String,String> map);
public abstract void RightPesenter(HashMap<String,String> map);
}
//m层
interface Lloadmodel{
void LeftModel(HashMap<String,String> map, RequestCallBack callBack);
void RighModel(HashMap<String,String> map, RequestCallBack callBack);
}
//v层
interface LloadView{
void LeftOnSuccess(String result);
void LeftOnfailure(String msg);
void RightOnSuccess(String result);
void RightOnfailure(String msg);
}
}
OkHttpUtils工具类不需要改变
import android.os.Handler;
import java.io.IOException;
import java.util.HashMap;
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.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* <p>文件描述:<p>
* <p>作者:JYB<p>
* <p>创建时间:2019/2/22<p>
* <p>更改时间:2019/2/22<p>
* <p>版本号:1<p>
*/
public class OkHttpUtils {
private static OkHttpUtils mInstance;
private final OkHttpClient okHttpClient;
private Handler handler = new Handler();
//单例模式
public static OkHttpUtils getmInstance(){
if(mInstance==null){
synchronized (OkHttpUtils.class){
if(mInstance==null){
mInstance=new OkHttpUtils();
}
}
}
return mInstance;
}
//私有构造
private OkHttpUtils(){
//拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//设置拦截器
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//创建OkHttpClient
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.writeTimeout(5,TimeUnit.SECONDS)
.connectTimeout(5,TimeUnit.SECONDS)
.readTimeout(5,TimeUnit.SECONDS)
.build();
}
//get请求
public void doGet(String url,final OkHttpCallBack okHttpCallBack){
//创建Request
Request build = new Request.Builder()
.url(url)
.get()
.build();
okHttpClient.newCall(build).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
okHttpCallBack.failure("网络异常");
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.code()==200){
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
okHttpCallBack.Success(string);
}
});
}
}
});
}
//post方式
public void doPost(String url, HashMap<String,String> params, final OkHttpCallBack callBack){
//拿到body
FormBody.Builder builder = new FormBody.Builder();
//添加参数
for(Map.Entry<String,String>map:params.entrySet()){
builder.add(map.getKey(),map.getValue());
}
//拿到RequestBody
RequestBody requestBody = builder.build();
//创建Request
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(callBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
callBack.failure("网络连接不上");
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(callBack!=null){
if(response.code()==200){
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
callBack.Success(string);
}
});
}
}
}
});
}
}
OkCallBack接口没有改变
public interface OkHttpCallBack {
void Success(String result);
void failure(String msg);
}
RequestCallBack也没有改变
public interface RequestCallBack {
void Success(String result);
void failure(String msg);
}
接下来就是Model层的一些操作,在原基础上添加了一些操作
import android.os.Handler;
import java.util.HashMap;
import java.util.Map;
import jiaoyibo.bawei.com.fenleizhanshi.api.UserApi;
import jiaoyibo.bawei.com.fenleizhanshi.contract.LoadContract;
import jiaoyibo.bawei.com.fenleizhanshi.net.OkHttpCallBack;
import jiaoyibo.bawei.com.fenleizhanshi.net.OkHttpUtils;
import jiaoyibo.bawei.com.fenleizhanshi.net.RequestCallBack;
/**
* <p>文件描述:<p>
* <p>作者:JYB<p>
* <p>创建时间:2019/2/22<p>
* <p>更改时间:2019/2/22<p>
* <p>版本号:1<p>
*/
public class LoadModel implements LoadContract.Lloadmodel{
private Handler handler = new Handler();
private String key;
private String value;
@Override
public void LeftModel(HashMap<String, String> map, final RequestCallBack callBack) {
OkHttpUtils.getmInstance().doGet(UserApi.LEFT_API, new OkHttpCallBack() {
@Override
public void Success(final String result) {
if(callBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
callBack.Success(result);
}
});
}
}
@Override
public void failure(final String msg) {
if(callBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
callBack.failure(msg);
}
});
}
}
});
}
@Override
public void RighModel(HashMap<String, String> map, final RequestCallBack callBack) {
//for循环遍历数据
for(Map.Entry<String,String>map1:map.entrySet()){
key = map1.getKey();
value = map1.getValue();
}
String s = UserApi.RIGHT_API+value;
OkHttpUtils.getmInstance().doGet(s, new OkHttpCallBack() {
@Override
public void Success(final String result) {
if(callBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
callBack.Success(result);
}
});
}
}
@Override
public void failure(final String msg) {
if(callBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
callBack.failure(msg);
}
});
}
}
});
}
}
presenter层没有太大的方法,就是多了个方法
import java.util.HashMap;
import jiaoyibo.bawei.com.fenleizhanshi.contract.LoadContract;
import jiaoyibo.bawei.com.fenleizhanshi.model.LoadModel;
import jiaoyibo.bawei.com.fenleizhanshi.net.RequestCallBack;
/**
* <p>文件描述:<p>
* <p>作者:JYB<p>
* <p>创建时间:2019/2/22<p>
* <p>更改时间:2019/2/22<p>
* <p>版本号:1<p>
*/
public class LoadPresenter extends LoadContract.LloadPresenter {
private LoadContract.LloadView lloadView;
private final LoadModel loadModel;
public LoadPresenter(LoadContract.LloadView lloadView) {
this.lloadView = lloadView;
loadModel = new LoadModel();
}
@Override
public void LeftPesenter(HashMap<String, String> map) {
loadModel.LeftModel(map, new RequestCallBack() {
@Override
public void Success(String result) {
if(lloadView!=null){
lloadView.LeftOnSuccess(result);
}
}
@Override
public void failure(String msg) {
if(lloadView!=null){
lloadView.LeftOnfailure(msg);
}
}
});
}
@Override
public void RightPesenter(HashMap<String, String> map) {
loadModel.RighModel(map, new RequestCallBack() {
@Override
public void Success(String result) {
if(lloadView!=null){
lloadView.RightOnSuccess(result);
}
}
@Override
public void failure(String msg) {
if(lloadView!=null){
lloadView.RightOnfailure(msg);
}
}
});
}
}
接下来就是主页的操作
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.view.MenuItem;
import android.widget.TextView;
import com.google.gson.Gson;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.HashMap;
import jiaoyibo.bawei.com.fenleizhanshi02.adapter.LeftAdapter;
import jiaoyibo.bawei.com.fenleizhanshi02.adapter.RightAdapter;
import jiaoyibo.bawei.com.fenleizhanshi02.bean.LeftBean;
import jiaoyibo.bawei.com.fenleizhanshi02.bean.RightBean;
import jiaoyibo.bawei.com.fenleizhanshi02.contract.LoadContract;
import jiaoyibo.bawei.com.fenleizhanshi02.presenter.LoadPresenter;
public class ShowActivity extends AppCompatActivity implements LoadContract.LloadView,LeftAdapter.OnClickListener {
private XRecyclerView xrec;
private XRecyclerView xrec1;
private LoadPresenter loadPresenter;
private LeftAdapter leftAdapter;
private RightAdapter rightAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
xrec = findViewById(R.id.xrec);
xrec1 = findViewById(R.id.xrec1);
//连接p层
loadPresenter = new LoadPresenter(this);
//设置布局样式
xrec.setLayoutManager(new LinearLayoutManager(this));
xrec1.setLayoutManager(new GridLayoutManager(this,3));
//获取适配器
leftAdapter = new LeftAdapter(this);
rightAdapter = new RightAdapter(this);
//创建左适配器p层的集合
loadPresenter.LeftPresenter(new HashMap<String, String>());
//创建一个空集合往里面存放数据
HashMap<String,String> map = new HashMap<>();
//传入参数
map.put("Keyword","女装");
//将集合赋值给右适配器
loadPresenter.RightPresenter(map);
//右布局展示,这一步最好写出来,不然会和做布局发生冲突
xrec1.setAdapter(rightAdapter);
}
@Override
public void LeftSuccess(String result) {
//解析
LeftBean leftBean = new Gson().fromJson(result, LeftBean.class);
//左布局展示
xrec.setAdapter(leftAdapter);
//条目点击事件
leftAdapter.setonItemClickLisener(this);
//适配器数据展示
leftAdapter.setList(leftBean.result);
}
@Override
public void LeftFailure(String msg) {
}
@Override
public void RightSuccess(String result) {
//解析
RightBean rightBean = new Gson().fromJson(result, RightBean.class);
//适配器数据展示
rightAdapter.setList(rightBean.result);
}
@Override
public void RightFailure(String msg) {
}
@Override
public void click(String cid) {
//创建集合
HashMap<String,String> map = new HashMap<>();
//传入参数
map.put("Keyword",cid);
//将集合赋值给右适配器
loadPresenter.RightPresenter(map);
}
}
相对的就会有两个适配器
package jiaoyibo.bawei.com.fenleizhanshi.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.List;
import jiaoyibo.bawei.com.fenleizhanshi.R;
import jiaoyibo.bawei.com.fenleizhanshi.bean.LeftBean;
/**
* <p>文件描述:<p>
* <p>作者:JYB<p>
* <p>创建时间:2019/2/22<p>
* <p>更改时间:2019/2/22<p>
* <p>版本号:1<p>
*/
public class LeftAdapter extends XRecyclerView.Adapter<LeftAdapter.ViewHolder> {
private Context context;
private List<LeftBean.ResultBean> list;
public LeftAdapter(Context context) {
this.context = context;
list = new ArrayList<>();
}
public void setList(List<LeftBean.ResultBean> list) {
if (list!=null){
this.list = list;
}
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.linear1,viewGroup,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder,final int i) {
LeftBean.ResultBean resultBean = list.get(i);
viewHolder.name.setText(list.get(i).name);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onClickListener!=null){
onClickListener.click(list.get(i).name.substring(0,2));
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView name;
public ViewHolder(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
}
}
private OnClickListener onClickListener;
public void setonItemClickLisener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public interface OnClickListener{
void click(String cid);
}
}
package jiaoyibo.bawei.com.fenleizhanshi.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
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.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.List;
import jiaoyibo.bawei.com.fenleizhanshi.R;
import jiaoyibo.bawei.com.fenleizhanshi.bean.RightBean;
/**
* <p>文件描述:<p>
* <p>作者:JYB<p>
* <p>创建时间:2019/2/22<p>
* <p>更改时间:2019/2/22<p>
* <p>版本号:1<p>
*/
public class RightAdapter extends XRecyclerView.Adapter<RightAdapter.ViewHolder1> {
private Context context;
private List<RightBean.ResultBean> list;
public RightAdapter(Context context) {
this.context = context;
list = new ArrayList<>();
}
public void setList(List<RightBean.ResultBean> list) {
if (list!=null){
this.list = list;
};
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder1 onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view =LayoutInflater.from(context).inflate(R.layout.linear2,viewGroup,false);
ViewHolder1 viewHolder1 = new ViewHolder1(view);
return viewHolder1;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder1 viewHolder1, int i) {
viewHolder1.name.setText(list.get(i).name);
viewHolder1.name.setText(list.get(i).commodityName);
String [] images = resultBean.masterPic.split("\\|");
Glide.with(context).load(images[0]).into(viewHolder1.image);
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder1 extends RecyclerView.ViewHolder {
private TextView name;
private ImageView image;
public ViewHolder1(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
image=itemView.findViewById(R.id.image);
}
}
}
主页面布局的操作
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/xrec"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
></com.jcodecraeer.xrecyclerview.XRecyclerView>
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#f00"/>
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/xrec1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
></com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>
</LinearLayout>
有两个适配器,当然也需要增加两个布局
<?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="wrap_content"
android:layout_margin="10dp"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:text="标题"
android:textSize="25dp"
android:maxLength="4"
android:layout_marginTop="5dp"
/>
<View
android:layout_width="100dp"
android:layout_height="2dp"
android:background="#D1D1D1"/>
</LinearLayout>
<?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="wrap_content"
android:layout_margin="10dp"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/image"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:text="标题"
android:layout_marginTop="110dp"
android:textSize="15dp"
android:layout_centerHorizontal="true"
android:maxLength="4"
/>
</RelativeLayout>
</LinearLayout>