一,依赖
compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'com.squareup.okhttp3:logging-interceptor:3.9.1' compile 'com.facebook.fresco:fresco:1.5.0' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.youth.banner:banner:1.4.10'
二,权限
<uses-permission android:name="android.permission.INTERNET" />
三 , main 布局
<?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="ywf.bwei.com.lianxi_dianshang.MainActivity"> <ListView android:id="@+id/lv_left" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:scrollbars="none" /> <ScrollView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="4" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 这是banner轮播--> <!--<com.youth.banner.Banner android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="200dp" />--> <ywf.bwei.com.lianxi_dianshang.utils.MyExpanableListView android:id="@+id/elv" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </ScrollView> </LinearLayout>class_left_item 布局<?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="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" /> </LinearLayout>
class_right_item1 布局<?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="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center_vertical" /> </LinearLayout>
class_right_item2 布局<?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="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
right_elv_item 布局<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv" android:layout_width="50dp" android:layout_height="50dp" fresco:placeholderImage="@mipmap/ic_launcher" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
四,创建 adapter,base,bean,model,net,persenter,utils,包model 层 ClassModel
public class ClassModel implements ClassContract.IClassModel { @Override public void getCatagory(final OnNetListener<CatagoryBean> onNetListener) { ServiceApi serviceApi = RetrofitHelper.getServiceApi(); serviceApi.getCatagory() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<CatagoryBean>() { @Override public void accept(CatagoryBean catagoryBean) throws Exception { onNetListener.onSuccess(catagoryBean); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { onNetListener.onFailure((Exception) throwable); } }); } @Override public void getProductCatagory(String cid, final OnNetListener<ProductCatagoryBean> onNetListener) { ServiceApi serviceApi = RetrofitHelper.getServiceApi(); serviceApi.getProductCatagory(cid) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<ProductCatagoryBean>() { @Override public void accept(ProductCatagoryBean productCatagoryBean) throws Exception { onNetListener.onSuccess(productCatagoryBean); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { onNetListener.onFailure((Exception) throwable); } }); } }persenter 层 ClassPresenter
public class ClassPresenter implements ClassContract.IClassPresetner { private ClassContract.IClassView iClassView; private ClassContract.IClassModel iClassModel; public ClassPresenter(ClassContract.IClassView iClassView) { this.iClassView = iClassView; iClassModel = new ClassModel(); } public void getCatagoty() { iClassModel.getCatagory(new OnNetListener<CatagoryBean>() { @Override public void onSuccess(CatagoryBean catagoryBean) { iClassView.showData(catagoryBean.getData()); //拿到右侧第一条数据 List<CatagoryBean.DataBean> dataBean = catagoryBean.getData(); int cid = dataBean.get(0).getCid(); //获取右侧的数据 getProfuctCatagory(cid + ""); } @Override public void onFailure(Throwable throwable) { } }); } public void getProfuctCatagory(String cid) { iClassModel.getProductCatagory(cid, new OnNetListener<ProductCatagoryBean>() { @Override public void onSuccess(ProductCatagoryBean productCatagoryBean) { iClassView.showElvData(productCatagoryBean.getData()); } @Override public void onFailure(Throwable throwable) { } }); } }
base 层 OnNetListener
public interface OnNetListener<T> { void onSuccess(T t); void onFailure(Throwable throwable); }
bean 层 CatagoryBean
public class CatagoryBean { /** * msg : * code : 0 * data : [{"cid":1,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/shop.png","ishome":1,"name":"京东超市"},{"cid":2,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/qqg.png","ishome":1,"name":"全球购"},{"cid":3,"createtime":"2017-10-10T19:45:11","icon":"http://120.27.23.105/images/category/phone.png","ishome":1,"name":"手机数码"},{"cid":5,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/man.png","ishome":1,"name":"男装"},{"cid":6,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girl.png","ishome":1,"name":"女装"},{"cid":7,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/manshoe.png","ishome":1,"name":"男鞋"},{"cid":8,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girlshoe.png","ishome":1,"name":"女鞋"},{"cid":9,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/shirt.png","ishome":1,"name":"内衣配饰"},{"cid":10,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/bag.png","ishome":1,"name":"箱包手袋"},{"cid":11,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/beauty.png","ishome":1,"name":"美妆个护"},{"cid":12,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/jewel.png","ishome":1,"name":"钟表珠宝"},{"cid":13,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/luxury.png","ishome":1,"name":"奢侈品"},{"cid":14,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/computer.png","ishome":1,"name":"电脑办公"},{"cid":15,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"家用电器"},{"cid":16,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"食品生鲜"},{"cid":17,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"酒水饮料"},{"cid":18,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"母婴童装"},{"cid":19,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"玩具乐器"},{"cid":20,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"医药保健"}] */ 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 boolean checked;//控制点击背景颜色 private int cid; private String createtime; private String icon; private int ishome; private String name; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } 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 层 ProductCatagoryBean
public class ProductCatagoryBean { /** * 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://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; } } } }
net 层 RetrofitHelper
public class RetrofitHelper { private static Retrofit retrofit; private static ServiceApi serviceApi; /** * 初始化Retrofit 单例模式 */ private static Retrofit getRetrofit() { //线程安全 if (retrofit == null) { synchronized (RetrofitHelper.class) { if (retrofit == null) { //设置拦截器 HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); //初始化OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging)//添加拦截器 .addInterceptor(new MyInterceptor()) .connectTimeout(50, TimeUnit.SECONDS)//设置连接超时 .build(); //初始化Retrofit retrofit = new Retrofit.Builder() .baseUrl(UrlsApi.BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } } } return retrofit; } public static ServiceApi getServiceApi() { if (serviceApi == null) { synchronized (RetrofitHelper.class) { if (serviceApi == null) { serviceApi = getRetrofit().create(ServiceApi.class); } } } return serviceApi; } /** * 添加公共参数拦截器 */ static class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl httpUrl = request .url() .newBuilder() .addQueryParameter("source", "android") .build(); Request requestNew = request .newBuilder() .url(httpUrl) .build(); return chain.proceed(requestNew); } } }
net 层 ServiceApi
public interface ServiceApi { @GET(UrlsApi.CATAGORY) Observable<CatagoryBean> getCatagory(); @GET(UrlsApi.PRODUCTCATAGORY) Observable<ProductCatagoryBean> getProductCatagory(@Query("cid") String cid); }
net 层 UrlsApi
public class UrlsApi { public static final String BASE_URL = "https://www.zhaoapi.cn/"; public static final String CATAGORY = "product/getCatagory";//分类 public static final String PRODUCTCATAGORY = "product/getProductCatagory";//商品子分类接 }
utils 层 GlideImageLoader
public class GlideImageLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { /** 注意: 1.图片加载器由自己选择,这里不限制,只是提供几种使用方法 2.返回的图片路径为Object类型,由于不能确定你到底使用的那种图片加载器, 传输的到的是什么格式,那么这种就使用Object接收和返回,你只需要强转成你传输的类型就行, 切记不要胡乱强转! */ //用fresco加载图片简单用法,记得要写下面的createImageView方法 Uri uri = Uri.parse((String) path); imageView.setImageURI(uri); } //提供createImageView 方法,如果不用可以不重写这个方法,主要是方便自定义ImageView的创建 @Override public ImageView createImageView(Context context) { //使用fresco,需要创建它提供的ImageView,当然你也可以用自己自定义的具有图片加载功能的ImageView SimpleDraweeView simpleDraweeView = new SimpleDraweeView(context); return simpleDraweeView; } }
utils 层 MyApp
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
utils 层 MyExpanableListView
public class MyExpanableListView extends ExpandableListView { public MyExpanableListView(Context context) { super(context); } public MyExpanableListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyExpanableListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //重新设置高度 heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
adapter 层 ElvRvAdapter
public class ElvRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<ProductCatagoryBean.DataBean.ListBean> listBeen; //2、定义一个属性 private OnItemClickListener onItemClickListener; //1、接口回调第一步,先定义一个接口 public interface OnItemClickListener { public void onItemClick(ProductCatagoryBean.DataBean.ListBean listBean); } //3、定义一个方法 public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public ElvRvAdapter(Context context, List<ProductCatagoryBean.DataBean.ListBean> listBeen) { this.context = context; this.listBeen = listBeen; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.right_elv_item, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final ProductCatagoryBean.DataBean.ListBean listBean = listBeen.get(position); MyViewHolder myViewHolder = (MyViewHolder) holder; myViewHolder.tv.setText(listBean.getName()); myViewHolder.iv.setImageURI(listBean.getIcon()); myViewHolder.ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(listBean); } }); } @Override public int getItemCount() { return listBeen.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private SimpleDraweeView iv; private TextView tv; private LinearLayout ll; public MyViewHolder(View itemView) { super(itemView); iv = itemView.findViewById(R.id.iv); tv = itemView.findViewById(R.id.tv); ll = itemView.findViewById(R.id.ll); } } }adapter 层 LeftAdapter
public class LeftAdapter extends BaseAdapter { private Context context; private List<CatagoryBean.DataBean> list; public LeftAdapter(Context context, List<CatagoryBean.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 convertView, ViewGroup parent) { View view; ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); view = View.inflate(context, R.layout.class_left_item, null); holder.tv = view.findViewById(R.id.tv); view.setTag(holder); } else { view = convertView; holder = (ViewHolder) view.getTag(); } CatagoryBean.DataBean dataBean = list.get(position); holder.tv.setText(dataBean.getName()); //自己加的属性,用于判断是否选中 if (dataBean.isChecked()) { holder.tv.setBackgroundColor(Color.parseColor("#EEEEEE")); holder.tv.setTextColor(Color.parseColor("#FF0000")); } else { holder.tv.setBackgroundColor(Color.parseColor("#ffffff")); holder.tv.setTextColor(Color.parseColor("#FF262426")); } return view; } class ViewHolder { TextView tv; } /** * 条目点击变色方法 * * @param position */ public void press(int position) { //先遍历循环list集合 for (int i = 0; i < list.size(); i++) { CatagoryBean.DataBean dataBean = list.get(i); dataBean.setChecked(false); } CatagoryBean.DataBean dataBean = list.get(position); dataBean.setChecked(true); notifyDataSetChanged(); } }
adapter 层 RightAdapter
public class RightAdapter extends BaseExpandableListAdapter { private Context context; private List<String> groupList;//一级列表数据 private List<List<ProductCatagoryBean.DataBean.ListBean>> childList;//二级列表数据 private LayoutInflater inflater; public RightAdapter(Context context, List<String> groupList, List<List<ProductCatagoryBean.DataBean.ListBean>> childList) { this.context = context; this.groupList = groupList; this.childList = childList; inflater = LayoutInflater.from(context); } @Override public int getGroupCount() { return groupList.size(); } @Override public int getChildrenCount(int groupPosition) { return 1; } @Override public Object getGroup(int groupPosition) { return groupList.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return childList.get(groupPosition).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder holder; View view; if (convertView == null) { holder = new GroupViewHolder(); view = inflater.inflate(R.layout.class_right_item1, null); holder.tv = view.findViewById(R.id.tv); view.setTag(holder); } else { view = convertView; holder = (GroupViewHolder) view.getTag(); } String str = groupList.get(groupPosition); holder.tv.setText(str); return view; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder holder; View view; if (convertView == null) { holder = new ChildViewHolder(); view = inflater.inflate(R.layout.class_right_item2, null); holder.rv = view.findViewById(R.id.rv); view.setTag(holder); } else { view = convertView; holder = (ChildViewHolder) view.getTag(); } List<ProductCatagoryBean.DataBean.ListBean> listBeen = childList.get(groupPosition); //1.给RecyclerView设置布局管理器 holder.rv.setLayoutManager(new GridLayoutManager(context, 3));//这个布局管理器,是类似gridcview的效果 //2.设置适配器 ElvRvAdapter elvRvAdapter = new ElvRvAdapter(context, listBeen); holder.rv.setAdapter(elvRvAdapter); elvRvAdapter.setOnItemClickListener(new ElvRvAdapter.OnItemClickListener() { @Override public void onItemClick(ProductCatagoryBean.DataBean.ListBean listBean) { //就是跳转 /*Intent intent = new Intent(context, Main2Activity.class); //intent.putExtra("pscid", listBean.getPscid()); context.startActivity(intent);*/ } }); return view; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } class GroupViewHolder { TextView tv; } class ChildViewHolder { RecyclerView rv; } }
ClassContract 是和 main 函数同一级别
public class ClassContract { /** * V视图层 */ public interface IClassView { void showData(List<CatagoryBean.DataBean> list); void showElvData(List<ProductCatagoryBean.DataBean> list); } /** * P视图与逻辑处理的连接层 */ public interface IClassPresetner { } /** * M逻辑(业务)处理层 */ public interface IClassModel { void getCatagory(OnNetListener<CatagoryBean> onNetListener); void getProductCatagory(String cid, OnNetListener<ProductCatagoryBean> onNetListener); } }main 函数public class MainActivity extends AppCompatActivity implements ClassContract.IClassView{ private ListView mLvLeft; //private Banner mBanner; private MyExpanableListView mElv; private LeftAdapter adapter; private List<String> groupList = new ArrayList<>();//一级列表数据 private List<List<ProductCatagoryBean.DataBean.ListBean>> childList = new ArrayList<>();//二级列表数据 private ClassPresenter classPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); classPresenter = new ClassPresenter(this); //去P层,调用getCatagory classPresenter.getCatagoty(); } private void initView() { mLvLeft = (ListView) findViewById(R.id.lv_left); //mBanner = (Banner) findViewById(R.id.banner); mElv = (MyExpanableListView) findViewById(R.id.elv); /* //设置图片加载器 mBanner.setImageLoader(new GlideImageLoader()); //设置图片集合 List<String> images = new ArrayList<>(); images.add("http://img1.imgtn.bdimg.com/it/u=594559231,2167829292&fm=27&gp=0.jpg"); images.add("http://pic4.nipic.com/20091217/3885730_124701000519_2.jpg"); images.add("http://pic.58pic.com/58pic/13/74/51/99d58PIC6vm_1024.jpg"); mBanner.setImages(images); //banner设置方法全部调用完毕时最后调用 mBanner.start();*/ } @Override public void showData(List<CatagoryBean.DataBean> list) { //创建适配器 adapter = new LeftAdapter(this, list); mLvLeft.setAdapter(adapter); //设置默认展示 adapter.press(0); //给listview 设置点击事件 mLvLeft.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { adapter.press(position); //请求对应的右侧数据 //先获取cid CatagoryBean.DataBean dataBean = (CatagoryBean.DataBean) parent.getItemAtPosition(position); int cid = dataBean.getCid(); classPresenter.getProfuctCatagory(cid + ""); } }); } @Override public void showElvData(List<ProductCatagoryBean.DataBean> list) { groupList.clear(); childList.clear(); //给二级列表封住数据 for (int i = 0; i < list.size(); i++) { ProductCatagoryBean.DataBean dataBean = list.get(i); groupList.add(dataBean.getName()); childList.add(dataBean.getList()); } //创建适配器 RightAdapter rightAdapter = new RightAdapter(this, groupList, childList); mElv.setAdapter(rightAdapter); //设置默认全部展开 for (int i = 0; i < list.size(); i++) { mElv.expandGroup(i); } //设置父节点(章目录)不可点击 mElv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { //返回true,表示不可点击 return true; } }); } }在清单文件中 写 name