layout_fl.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/fl_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/margin5"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/scan"
android:layout_width="@dimen/mysearchview_height"
android:layout_height="@dimen/mysearchview_height"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="@dimen/search_height"
android:layout_height="@dimen/search_height"
android:src="@drawable/sao_kind"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="扫啊扫"/>
</LinearLayout>
<com.bwie.shiyue.jd.view.customview.MySearchView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="@dimen/mysearchview_height">
</com.bwie.shiyue.jd.view.customview.MySearchView>
<LinearLayout
android:layout_width="@dimen/mysearchview_height"
android:layout_height="@dimen/mysearchview_height"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="@dimen/search_height"
android:layout_height="@dimen/search_height"
android:src="@drawable/msg_hei"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="消息"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_below="@+id/fl_search"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/fl_left"
android:layout_width="100dp"
android:layout_height="match_parent">
</ListView>
<ListView
android:id="@+id/fl_right"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
</RelativeLayout>
layout_fl_left.xml
<?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:layout_width="100dp"
android:layout_height="50dp"
android:textStyle="bold"
android:gravity="center"
android:id="@+id/fl_left_tv"
android:textSize="15sp"/>
</LinearLayout>
layout_fl_right.xml
<?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:background="#eee"
android:orientation="vertical">
<TextView
android:id="@+id/fl_right_tv"
android:textSize="15sp"
android:text="123"
android:paddingLeft="10dp"
android:gravity="center_vertical"
android:background="#c7bbbb"
android:layout_width="match_parent"
android:layout_height="30dp" />
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/right_rcy"
></android.support.v7.widget.RecyclerView>
</LinearLayout>
layout_fl_right_item.xml
<?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:background="#eee"
android:orientation="vertical">
<LinearLayout
android:id="@+id/right_llt"
android:layout_width="match_parent"
android:layout_height="120dp"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/item_img"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center_horizontal"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/item_home_name"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:singleLine="false"
android:layout_marginTop="10dp"
android:text="标题"
android:textSize="12dp" />
</LinearLayout>
</LinearLayout>
adapter包
LeftAdapter
public class LeftAdapter extends BaseAdapter {
private Context context;
private List<SYNavBean.DataBean> list;
public LeftAdapter(Context context, List<SYNavBean.DataBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
ViewHolder viewHolder=null;
if(view==null){
view = View.inflate(context, R.layout.layout_fl_left, null);
TextView textView = view.findViewById(R.id.fl_left_tv);
viewHolder = new ViewHolder(textView);
view.setTag(viewHolder);
}else{
viewHolder= (ViewHolder) view.getTag();
}
viewHolder.getTextView().setText(list.get(position).getName());
return view;
}
class ViewHolder{
private TextView textView;
public ViewHolder(TextView textView) {
this.textView = textView;
}
public TextView getTextView() {
return textView;
}
public void setTextView(TextView textView) {
this.textView = textView;
}
}
}
RightAdapter
public class RightAdapter extends BaseAdapter{
private Context context;
private List<ClassBean.DataBean> data;
public RightAdapter(Context context, List<ClassBean.DataBean> data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return data.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder=null;
List<ClassBean.DataBean.ListBean> list = this.data.get(i).getList();
if(view==null){
view=View.inflate(context, R.layout.layout_fl_right,null);
holder=new ViewHolder();
holder.tvRight=view.findViewById(R.id.fl_right_tv);
holder.rightRcy=view.findViewById(R.id.right_rcy);
view.setTag(holder);
}else{
holder= (ViewHolder) view.getTag();
}
holder.tvRight.setText(list.get(i).getName());
RightItemAdapter adapter=new RightItemAdapter(context,list);
holder.rightRcy.setLayoutManager(new GridLayoutManager(context,3));
holder.rightRcy.setAdapter(adapter);
return view;
}
class ViewHolder{
TextView tvRight;
RecyclerView rightRcy;
}
}
RightItemAdapter
public class RightItemAdapter extends RecyclerView.Adapter<RightItemAdapter.ViewHolder>{
private Context context;
private List<ClassBean.DataBean.ListBean> list;
public RightItemAdapter(Context context, List<ClassBean.DataBean.ListBean> list) {
this.context = context;
this.list = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.layout_fl_right_item, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemName.setText(list.get(position).getName());
Glide.with(context).load(list.get(position).getIcon()).into(holder.itemImg);
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView itemName;
private ImageView itemImg;
private LinearLayout rightLlt;
public ViewHolder(View itemView) {
super(itemView);
itemName = itemView.findViewById(R.id.item_home_name);
itemImg = itemView.findViewById(R.id.item_img);
rightLlt = itemView.findViewById(R.id.right_llt);
}
}
}
HttpApi
public class HttpApi {
public static final String ClassUrl="https://www.zhaoapi.cn/product/getProductCatagory";
}
ClassBean
public class ClassBean {
/**
* 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:
* 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;
}
}
}
}
FLModel
public class FLModel implements IFLModel {
private static final String TAG = "FLModel----";
@Override
public void getFLLeftData(String url, Map<String, String> params, final SetModelListener setModelListener) {
OkHttpUtils okHttpUtils = OkHttpUtils.getInstance();
okHttpUtils.doPost(url,params);
okHttpUtils.setOnFinishListener(new OnFinishListener() {
@Override
public void onSuccess(String json) {
Log.d(TAG, "onSuccess: "+json);
setModelListener.getSuccess(json);
}
@Override
public void onFailed(String error) {
setModelListener.getError(error);
}
});
}
@Override
public void getFLRightData(String url, Map<String, String> params, final SetModelListener setModelListener) {
OkHttpUtils okHttpUtils = OkHttpUtils.getInstance();
okHttpUtils.doPost(url,params);
okHttpUtils.setOnFinishListener(new OnFinishListener() {
@Override
public void onSuccess(String json) {
Log.d(TAG, "onSuccess: "+json);
setModelListener.getSuccess(json);
}
@Override
public void onFailed(String error) {
setModelListener.getError(error);
}
});
}
}
IFLModel
public interface IFLModel {
void getFLLeftData(String url, Map<String, String> params, SetModelListener setModelListener);
void getFLRightData(String url, Map<String, String> params, SetModelListener setModelListener);
}
SetModelListener
public interface SetModelListener {
void getSuccess(String json);
void getError(String error);
}
IFLPresenter
public interface IFLPresenter {
void showLeftToView(IFLModel iflModel, IFLView iflView);
void showRightToView(IFLModel iflModel, IFLView iflView);
}
FLPresenter
public class FLPresenter implements IFLPresenter {
private static final String TAG ="FLPresenter----" ;
@Override
public void showLeftToView(IFLModel iflModel, final IFLView iflView) {
Map<String, String> params = new HashMap<>();
iflModel.getFLLeftData(HttpApi.NavUrl, params, new SetModelListener() {
@Override
public void getSuccess(String json) {
Log.d(TAG, "getSuccess: "+json);
Gson gson=new Gson();
SYNavBean syNavBean = gson.fromJson(json,SYNavBean.class);
List<SYNavBean.DataBean> data = syNavBean.getData();
iflView.showFLLeftData(data);
}
@Override
public void getError(String error) {
Log.d(TAG, "getError: "+error);
}
});
}
@Override
public void showRightToView(IFLModel iflModel, final IFLView iflView) {
Map<String, String> map = new HashMap<>();
Log.d(TAG, "showRightToView: "+iflView.getCid());
map.put("cid",iflView.getCid());
iflModel.getFLRightData(HttpApi.ClassUrl, map, new SetModelListener() {
@Override
public void getSuccess(String json) {
Log.d(TAG, "getSuccess: "+json);
Gson gson=new Gson();
ClassBean classBean = gson.fromJson(json, ClassBean.class);
List<ClassBean.DataBean> data = classBean.getData();
iflView.showFLRightData(data);
}
@Override
public void getError(String error) {
Log.d(TAG, "getError: "+error);
}
});
}
}
OkHttpUtils
public class OkHttpUtils {
private static final String TAG = "OkHttpUtils-----";
private static OkHttpUtils okHttpUtils;
private final int SUCCESS = 0;
private final int ERROR = 1;
private MyHandler myHandler = new MyHandler();
private OnFinishListener onFinishListener;
public static OkHttpUtils getInstance() {
if (null== okHttpUtils ) {
synchronized (OkHttpUtils.class){
if (okHttpUtils==null){
okHttpUtils = new OkHttpUtils();
}
}
}
return okHttpUtils;
}
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
String json = (String) msg.obj;
onFinishListener.onSuccess(json);
break;
case ERROR:
String error = (String) msg.obj;
onFinishListener.onFailed(error);
break;
}
}
}
public void doGet(String url) {
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new MyIntercepter()).build();
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = myHandler.obtainMessage();
message.what = ERROR;
message.obj = e.getMessage();
myHandler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = myHandler.obtainMessage();
message.what = SUCCESS;
message.obj = response.body().string();
myHandler.sendMessage(message);
}
});
}
public void setOnFinishListener(OnFinishListener onFinishListener) {
this.onFinishListener = onFinishListener;
}
public void doPost(String url, Map<String, String> params) {
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new MyIntercepter()).build();
FormBody.Builder builder = new FormBody.Builder();
Set<String> keySet = params.keySet();
for (String key :
keySet) {
String value = params.get(key);
builder.add(key, value);
}
FormBody formBody = builder.build();
Request request = new Request.Builder().url(url).post(formBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = myHandler.obtainMessage();
message.what = ERROR;
message.obj = e.getMessage();
myHandler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = myHandler.obtainMessage();
message.what = SUCCESS;
message.obj = response.body().string();
myHandler.sendMessage(message);
}
});
}
class MyIntercepter implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
String method = request.method();
if (method.equals("GET")) {
String url = request.url().toString();
boolean contains = url.contains("?");
if (contains) {
url = url + "&source=android";
} else {
url = url + "?source=android";
}
Request request1 = request.newBuilder().url(url).build();
Response response = chain.proceed(request1);
return response;
} else if (method.equals("POST")) {
RequestBody body = request.body();
if (body instanceof FormBody) {
FormBody.Builder newBuilder = new FormBody.Builder();
for (int i = 0; i < ((FormBody) body).size(); i++) {
String key = ((FormBody) body).name(i);
String value = ((FormBody) body).value(i);
newBuilder.add(key, value);
}
newBuilder.add("source", "android");
FormBody newBody = newBuilder.build();
Request request1 = request.newBuilder().post(newBody).build();
Response response = chain.proceed(request1);
return response;
}
}
return null;
}
}
public void upLoadImage(String url, String path) {
MediaType mediaType = MediaType.parse("image/*");
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
File file = new File(path);
MultipartBody multipartBody = builder.addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file)).build();
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).post(multipartBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "上传失败0----: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "上传成功: ");
}
});
}
}
OnFinishListener
public interface OnFinishListener {
void onSuccess(String json);
void onFailed(String error);
}
IFLView
public interface IFLView {
void showFLLeftData(List<SYNavBean.DataBean> data);
void showFLRightData(List<ClassBean.DataBean> data);
String getCid();
}
FenLeiFragment
public class FenLeiFragment extends BaseFragment implements IFLView {
private static final String TAG = "FenLeiFragment----";
private ListView fl_left,fl_right;
private FLPresenter flPresenter;
private List<SYNavBean.DataBean> list;
private String cid;
/**
* 标志位,标志已经初始化完成
*/
private boolean isPrepared;
/**
* 是否已被加载过一次,第二次就不再去请求数据了
*/
private boolean mHasLoadedOnce;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mView == null) {
mView = inflater.inflate(R.layout.layout_fl, container, false);
initView();
isPrepared = true;
lazyLoad();
}
ViewGroup parent = (ViewGroup) mView.getParent();
if (parent != null) {
parent.removeView(mView);
}
return mView;
}
/**
* 初始化控件
*/
private void initView() {
fl_left = mView.findViewById(R.id.fl_left);
fl_right = mView.findViewById(R.id.fl_right);
fl_left.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
int id = list.get(i).getCid();
FenLeiFragment.this.cid=id+"";
flPresenter.showRightToView(new FLModel(),FenLeiFragment.this);
}
});
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (getUserVisibleHint()) {
Log.d(TAG, "可见");
flPresenter = new FLPresenter();
flPresenter.showLeftToView(new FLModel(),this);
}
}
@Override
public void lazyLoad() {
if (!isPrepared || !isVisible || mHasLoadedOnce) {
return;
}
mHasLoadedOnce = true;
}
public static FenLeiFragment newInstance(String param1) {
FenLeiFragment fragment = new FenLeiFragment();
Bundle args = new Bundle();
args.putString("agrs1", param1);
fragment.setArguments(args);
return fragment;
}
@Override
public void showFLLeftData(List<SYNavBean.DataBean> data) {
Log.d(TAG, "showFLLeftData: "+data);
this.list=data;
LeftAdapter leftAdapter=new LeftAdapter(getContext(),data);
fl_left.setAdapter(leftAdapter);
int cid = data.get(0).getCid();
this.cid=cid+"";
flPresenter.showRightToView(new FLModel(),this);
}
@Override
public void showFLRightData(List<ClassBean.DataBean> data) {
Log.d(TAG, "showFLRightData: "+data);
RightAdapter adapter=new RightAdapter(getContext(),data);
fl_right.setAdapter(adapter);
}
@Override
public String getCid() {
return this.cid;
}
}