添加依赖
compile 'com.google.code.gson:gson:2.2.4' compile 'com.squareup.okhttp3:okhttp:3.10.0' // compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.4.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' // 其他依赖 Fresco加载图片框架 compile 'com.facebook.fresco:fresco:0.12.0' compile 'com.facebook.fresco:animated-gif:0.12.0' compile 'org.greenrobot:eventbus:3.0.0'
清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.com.rikao4_20">
添加权限 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:name=".App" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
工具类
public class HttpUtils { //创建单例 private static volatile HttpUtils instance; private final Retrofit retrofit; //提供无参构造 private HttpUtils(){ //创建retrofit数据对象 retrofit = new Retrofit.Builder() .baseUrl("https://www.zhaoapi.cn/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } //得到HttpUtils静态单例 public static HttpUtils getInstance(){ //判断instance是否为空 if(instance==null){ //为空时为本类加锁 synchronized (HttpUtils.class){ //再次判断null是否等于instance if(null==instance){ //等于空时创建本类对象赋给instance instance=new HttpUtils(); } } } return instance; } //定义有返回值方法得到Apiservice为了调用httputils工具类时拼接url, public ApiService getApiservice(){ return retrofit.create(ApiService.class); } }
ApiService接口
public interface ApiService<T> { //商品分类接口(此接口用于首页九宫格,和底部页签分类页) //接口地址:https://www.zhaoapi.cn/product/getCatagory //商品子分类接口https://www.zhaoapi.cn/product/getProductCatagory //左边
@GET("product/getCatagory") Flowable<MessageBean<List<JavaBean>>> getService(); //右边
@GET("product/getProductCatagory") Flowable<MessageBean<List<ChildJavaBean>>> getapiservice(@Query("cid") String cid); }
Applaction类
public class App extends Application{ @Override public void onCreate() { super.onCreate(); //初始化Fresco Fresco.initialize(this); } }
bean类
public class MessageBean<T>{ private String msg; private String code; private T data; public T getData() { return data; } public void setData(T data) { this.data = 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 class JavaBean { 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; } }
=============================
public class ChildJavaBean { private String cid; private List<ZiTiaoBean> list; private String name; private String pcid; public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public List<ZiTiaoBean> getList() { return list; } public void setList(List<ZiTiaoBean> list) { this.list = list; } 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 class ZiTiaoBean { 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; } }
Model层
1.左边model代码
public class MyDataModel { //定义请求数据方法 public void getData(final Presenter presenter) { //调用工具类方法请求数据 ApiService apiservice = HttpUtils.getInstance().getApiservice(); Flowable<MessageBean<List<JavaBean>>> service = apiservice.getService(); presenter.success(service); } }
2.右边model代码
public class ChildModel { //定义请求数据成功方法 public void getChildData(String cid, final ChildPresenter presenter) { //调用工具类请求权数据方法 ApiService apiservice = HttpUtils.getInstance().getApiservice(); Flowable<MessageBean<List<ChildJavaBean>>> getapiservice = apiservice.getapiservice(cid); //把请求的数据传给p presenter.childsuccess(getapiservice); } }
Presenter层1.左边presenter代码
接口
public interface Presenter { //创建成功方法 void success(Flowable<MessageBean<List<JavaBean>>> service); //擦黄建子分类方法 }
类
public class MyPresenter implements Presenter{ private DataView dataView; //加载view public void attach(DataView dataView){ this.dataView=dataView; } //销毁view public void dettch(){ //判断dataview不为空时给dataview置空 if(dataView!=null){} dataView=null; } //定义得到m层数据方法 public void getMdata(){ //创建出m层对象 MyDataModel myDataModel=new MyDataModel(); myDataModel.getData(this); } @Override public void success(Flowable<MessageBean<List<JavaBean>>> service) { service.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DisposableSubscriber<MessageBean<List<JavaBean>>>() { //解析 @Override public void onNext(MessageBean<List<JavaBean>> listMessageBean) { //把解析的数据传给v dataView.getMdata(listMessageBean); } @Override public void onError(Throwable t) { dataView.faild(t); } @Override public void onComplete() { } }); } }
2.右边presenter代码
接口
public interface ChildPresenter { //定义成功方法 void childsuccess(Flowable<MessageBean<List<ChildJavaBean>>> getapiservice); //失败方法 void childerror(Throwable t); }
类
public class MyChildPresenter implements ChildPresenter{ private ChildDataView childDataView; //加载viw public void attachView(ChildDataView childDataView){ this.childDataView=childDataView; } //销毁ciew public void dettach(){ if(childDataView!=null){ childDataView=null; } } //得到m层请求数据方法 public void getChildMdata(String cid){ //创建m层对象 ChildModel childModel=new ChildModel(); childModel.getChildData(cid,this); } @Override public void childsuccess(Flowable<MessageBean<List<ChildJavaBean>>> getapiservice) { //切换线程并解析 getapiservice.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DefaultSubscriber<MessageBean<List<ChildJavaBean>>>() { @Override public void onNext(MessageBean<List<ChildJavaBean>> listMessageBean) { childDataView.childcheng(listMessageBean); } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }); } @Override public void childerror(Throwable t) { } }
view层代码
1.左边接口代码
public interface DataView { //定义得到数据方法 void getMdata(MessageBean<List<JavaBean>> listMessageBean); //定义失败方法 void faild(Throwable t); }
2.右边接口代码
public interface ChildDataView { //定义成功 失败方法 void childcheng(MessageBean<List<ChildJavaBean>> listMessageBean); void childerror(Throwable t); }
LeftFragment代码
public class LeftFragment extends Fragment implements DataView,LeftRecyAdapter.SetClick{ private RecyclerView re_leftview; private List<JavaBean> list_left; private LeftRecyAdapter adapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment_left,container,false); //EventBus.getDefault().register(this); ///找到控件 re_leftview = view.findViewById(R.id.re_view_left); //创建p层 MyPresenter myPresenter = new MyPresenter(); //得到dataview myPresenter.attach(this); //调用p层接收m层数据方法 myPresenter.getMdata(); LinearLayoutManager manager = new LinearLayoutManager(getActivity()); re_leftview.setLayoutManager(manager); //添加分割线 re_leftview.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL)); return view; } @Override public void getMdata(MessageBean<List<JavaBean>> listMessageBean) { Log.d("--", "getMdata: "+listMessageBean.getData().size()); list_left = listMessageBean.getData(); //设置适配器 adapter = new LeftRecyAdapter(getActivity(), list_left); re_leftview.setAdapter(adapter); adapter.getinteface(this); } @Override public void faild(Throwable t) { Log.d("==", "faild: "+t.getMessage()); } //实现的适配器定义接口的方法 @Override public void setClick(int i) { //点击是得到cid int cid = list_left.get(i).getCid();
//点击条目字体变红 //获取当前的索引 int myposition = i; //传到适配器 (调用适配器方法) adapter.getIndex(myposition); //刷新适配器 adapter.notifyDataSetChanged(); //发送给右边的fragment EventBus.getDefault().post(cid+""); } }
RightFragment代码
public class RightFragment extends Fragment implements ChildDataView{ private MyChildPresenter presenter; private RecyclerView rightre_view; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment_right,container,false); EventBus.getDefault().register(this); //找到控件 rightre_view = view.findViewById(R.id.re_view_right); //创建p层对象 presenter = new MyChildPresenter(); presenter.attachView(this); //调用p层结束m层得到数据方法 presenter.getChildMdata(1+""); //设置控制器 LinearLayoutManager manager=new LinearLayoutManager(getActivity()); rightre_view.setLayoutManager(manager); return view; } @Override public void childcheng(MessageBean<List<ChildJavaBean>> listMessageBean) { List<ChildJavaBean> data = listMessageBean.getData(); //为rightre_view设置适配器 RightRecyAdapter adapter=new RightRecyAdapter(getActivity(),data); rightre_view.setAdapter(adapter); } @Override public void childerror(Throwable t){ Log.d("===", "childerror: "+t.getMessage()); } //定义个订阅方法 @Subscribe(threadMode = ThreadMode.MAIN) public void getCid(String cid){ //调用p层接收m层数据方法请求数据 presenter.getChildMdata(cid); } @Override public void onDestroyView() { super.onDestroyView(); //取消注册 EventBus.getDefault().unregister(this); } }
自定义GridView
public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } // 自定义高度方法 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int i = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, i); } }
左边Adapter
public class LeftRecyAdapter extends RecyclerView.Adapter{ Context context; List<JavaBean> list_left; private LeftViewholder leftViewholder; private SetClick setClick; private int myposition; public LeftRecyAdapter(Context context, List<JavaBean> list_left) { this.context=context; this.list_left=list_left; } //定义得到接口对象,参数是接口对象 public void getinteface(SetClick setClick){ this.setClick=setClick; } //这是在适配器里实现方法,得到下标方法 public void getIndex(int myposition) { this.myposition = myposition; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //引入布局 View view= View.inflate(context,R.layout.fragment_left_item,null); leftViewholder = new LeftViewholder(view); return leftViewholder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { //自带viewhodlder与自定义的LeftViewholder绑定l leftViewholder= (LeftViewholder) holder; //点击改变字体颜色 if (position == myposition) { leftViewholder.leftre_text.setTextColor(Color.RED); }else { leftViewholder.leftre_text.setTextColor(Color.GRAY); } //赋值 leftViewholder.leftre_text.setText(list_left.get(position).getName()); //设置点击监听 leftViewholder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { setClick.setClick(position); } }); } @Override public int getItemCount() { return list_left.size(); } //创建viewholder class LeftViewholder extends RecyclerView.ViewHolder { private final TextView leftre_text; public LeftViewholder(View itemView) { super(itemView); leftre_text = itemView.findViewById(R.id.re_view_left_text); } } //定义个接口 定义点击事件 public interface SetClick{ //设置点击事件 void setClick(int i); } }
右边Adapter
public class RightRecyAdapter extends RecyclerView.Adapter { Context context; List<ChildJavaBean> data; private RightViewHolder rightViewHolder; public RightRecyAdapter(Context context, List<ChildJavaBean> data) { this.context=context; this.data=data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_right_iem,parent,false); //把布局和适配器绑定 rightViewHolder = new RightViewHolder(view); return rightViewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //把自定义RightViewholder与自带的viewholder绑定 rightViewHolder= (RightViewHolder) holder; rightViewHolder.re_text.setText(data.get(position).getName()); GridAdapter adapter=new GridAdapter(context,data); rightViewHolder.gridView.setAdapter(adapter); } @Override public int getItemCount() { return data.size(); } class RightViewHolder extends RecyclerView.ViewHolder { private final TextView re_text; private final GridView gridView; public RightViewHolder(View itemView) { super(itemView); re_text = itemView.findViewById(R.id.re_view_right_text); gridView = itemView.findViewById(R.id.zitiaonu); } } }
右边Adapter的子布局GridViewAdapter
class GridAdapter extends BaseAdapter{ Context context; List<ChildJavaBean> data; public GridAdapter(Context context, List<ChildJavaBean> 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; if(view==null){ view=View.inflate(context, R.layout.grid_item,null); holder=new ViewHolder(); holder.grid_img=view.findViewById(R.id.grid_img); holder.grid_text=view.findViewById(R.id.grid_text); view.setTag(holder); }else{ holder= (ViewHolder) view.getTag(); } holder.grid_text.setText(data.get(i).getName()); holder.grid_img.setImageURI(data.get(i).getList().get(i).getIcon()); return view; } class ViewHolder{ SimpleDraweeView grid_img; TextView grid_text; } }
MainActivity布局
<?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" tools:context="com.example.com.rikao4_20.MainActivity" android:orientation="horizontal"> <fragment android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:name="com.example.com.rikao4_20.LeftFragment" android:id="@+id/frag_left" ></fragment> <fragment android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="8" android:name="com.example.com.rikao4_20.RightFragment" android:id="@+id/frag_right"></fragment> </LinearLayout>
fragment_left.xml布局
<?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" tools:context="com.example.com.rikao4_20.MainActivity" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/re_view_left" android:background="#E8E8E8" ></android.support.v7.widget.RecyclerView> </LinearLayout>
fragment_right.xml布局
<?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" tools:context="com.example.com.rikao4_20.MainActivity" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/re_view_right"></android.support.v7.widget.RecyclerView> </LinearLayout>
fragment_left_item.xml布局
<?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" tools:context="com.example.com.rikao4_20.MainActivity" android:orientation="vertical" > <TextView android:padding="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/re_view_left_text" android:text="1111" android:layout_gravity="center_vertical" android:gravity="center" /> </LinearLayout>
fragment_right_iem.xml布局
<?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="wrap_content" tools:context="com.example.com.rikao4_20.MainActivity" android:orientation="vertical" > <TextView android:layout_marginTop="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/re_view_right_text" android:text="111" /> <com.example.com.rikao4_20.myview.MyGridView android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="3" android:id="@+id/zitiaonu"></com.example.com.rikao4_20.myview.MyGridView> </LinearLayout>
grid_item.xml布局
<?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" tools:context="com.example.com.rikao4_20.MainActivity" android:orientation="vertical" android:padding="20dp"> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="80dp" android:layout_gravity="center" android:layout_height="80dp" android:id="@+id/grid_img"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1111" android:layout_gravity="center" android:layout_marginTop="10dp" android:id="@+id/grid_text"/> </LinearLayout>