先是布局
activity_main.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.administrator.my1022.MainActivity"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/type_Catagory" android:layout_width="0dp" android:layout_weight="2" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> <ExpandableListView android:groupIndicator="@null" android:id="@+id/type_exl" android:layout_width="0dp" android:layout_weight="8" android:layout_height="match_parent"></ExpandableListView> </LinearLayout> </LinearLayout>activity_products.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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.administrator.my1022.ProductsActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/products_rv" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </android.support.constraint.ConstraintLayout>caragor_itemy.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:textStyle="bold" android:paddingTop="10dp" android:paddingBottom="10dp" android:id="@+id/catagory_name" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>child_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" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/child_img" android:layout_width="50dp" android:layout_height="50dp" app:placeholderImage="@drawable/ic_launcher_background"/> <TextView android:id="@+id/child_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>group_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"> <TextView android:id="@+id/group_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>grid_view.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:stretchMode="spacingWidthUniform"> <com.example.administrator.my1022.zidingyi.MyGridView android:id="@+id/grid" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="3"></com.example.administrator.my1022.zidingyi.MyGridView> </LinearLayout>products.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" xmlns:app="http://schemas.android.com/apk/res-auto"> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="100dp" android:layout_height="150dp" android:id="@+id/products_img" app:placeholderImage="@drawable/ic_launcher_background" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/products_title" android:layout_alignParentTop="true" android:layout_toEndOf="@+id/products_img" android:text="标题"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/productes_yuanjia" android:layout_above="@+id/products_xianjia" android:layout_marginBottom="-78dp" android:layout_toEndOf="@id/products_img" android:text="原价"/> <TextView android:textColor="@color/colorAccent" android:id="@+id/products_xianjia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="106dp" android:layout_toEndOf="@+id/products_img" android:text="现价" /> </RelativeLayout>activity_detail.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" 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.administrator.my1022.DetailActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9" android:orientation="vertical" > <com.youth.banner.Banner android:layout_width="match_parent" android:layout_height="350dp" android:id="@+id/datail_banner" ></com.youth.banner.Banner> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#FF0000" android:id="@+id/detail_price"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/detail_title" android:textColor="#363636" android:layout_marginTop="10dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/zxcv"></LinearLayout> </LinearLayout> <Button android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:text="加入购物车"/> </LinearLayout>
下面是JAVA代码
Api
public class Api { public static final String BASE_URL = "http://www.zhaoapi.cn/"; }MyApi
public interface MyApi { @GET("product/getCatagory") Observable<Catagory> getCatagory(); @GET("product/getProductCatagory") Observable<ProductCatagory> getProductCatagory(@Query( "cid" ) String cid); @GET("product/getProducts") Observable<Products> getProducts(@Query("pscid") String pscid); //商品详情 @GET("product/getProductDetail") Observable<Detail> getDetail(@Query("pid") String pid); }MyApp
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize( this ); } }MyLoader
public class MyLoader extends ImageLoader { @Override public ImageView createImageView(Context context) { return new SimpleDraweeView(context); } @Override public void displayImage(Context context, Object path, ImageView imageView) { imageView.setImageURI(Uri.parse((String) path)); } }RetrofitUtil
public class RetrofitUtil { private final Retrofit retrofit; private HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor( ).setLevel( HttpLoggingInterceptor.Level.BODY ); public RetrofitUtil() { retrofit = new Retrofit.Builder() .baseUrl( Api.BASE_URL ) .addConverterFactory( GsonConverterFactory.create( ) ) .addCallAdapterFactory( RxJava2CallAdapterFactory.create() ) .build(); } private OkHttpClient buildOkHttpClient(){ return new OkHttpClient.Builder() .addInterceptor( httpLoggingInterceptor ) .build(); } //暴露外部的方法 public static RetrofitUtil getDefault(){ return SingleHolder._instant; } private static class SingleHolder{ private static final RetrofitUtil _instant = new RetrofitUtil(); } //动态代理创建接口 public <T> T create(Class<T> Clazz){ return retrofit.create( Clazz ); } }IModel
public class IModel { //获取分类 public Observable<Catagory> getCatagory(){ return RetrofitUtil.getDefault().create( MyApi.class ).getCatagory(); } //获取子类 public Observable<ProductCatagory> getProductCatagory(String cid){ return RetrofitUtil.getDefault().create( MyApi.class ).getProductCatagory( cid ); } //获取商品列表 public Observable<Products> getProducts(String pscid){ return RetrofitUtil.getDefault().create( MyApi.class ).getProducts( pscid ); } public Observable<Detail> getDetail(String pid) { return RetrofitUtil.getDefault().create(MyApi.class).getDetail(pid); } }IView
public interface IView { void onCatagorySuccess(Catagory catagory); void onCatagoryFaild(); void onProductCatagorySuccess(ProductCatagory productCatagory); }ProductsView
public interface ProductsView { void onSuccess(Products products); }DetailView
public interface DetailView { void onDetailSuccess(Detail detail); }IProsenter
public class IProsenter { private IModel iModel; IView mIView; public IProsenter(IView iView){ mIView = iView; iModel = new IModel(); } //获得分类 public void getCatagory(){ iModel.getCatagory() .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe( new Observer<Catagory>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Catagory catagory) { mIView.onCatagorySuccess( catagory ); } @Override public void onError(Throwable e) { mIView.onCatagoryFaild(); } @Override public void onComplete() { } } ); } //获取子分类 public void getProductCatagory(String cid){ iModel.getProductCatagory( cid ) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe( new Observer<ProductCatagory>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ProductCatagory productCatagory) { mIView.onProductCatagorySuccess( productCatagory ); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } } ); } }ProductsProsenter
public class ProductsProsenter { private IModel iModel; ProductsView mView; public ProductsProsenter(ProductsView view){ mView = view; iModel = new IModel(); } public void getProducts(String pscid){ iModel.getProducts( pscid ) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe( new Observer<Products>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Products products) { mView.onSuccess( products ); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } } ); } }DetailProsenter
public class DetailProsenter { private IModel iModel; DetailView mView; public DetailProsenter(DetailView view){ mView = view; iModel = new IModel(); } public void geyDetail(String pid){ iModel.getDetail( pid ) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe( new Observer<Detail>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Detail detail) { mView.onDetailSuccess( detail ); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } } ); } }MainActivity
public class MainActivity extends AppCompatActivity implements IView{ @BindView(R.id.type_Catagory) RecyclerView typeCatagory; @BindView(R.id.type_exl) ExpandableListView typeExl; Unbinder unbinder; private IProsenter prosenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); unbinder=ButterKnife.bind( this ); initCatagory(); } private void initCatagory() { prosenter = new IProsenter( this ); typeCatagory.setLayoutManager( new LinearLayoutManager( this,LinearLayoutManager.VERTICAL,false ) ); prosenter.getCatagory(); } @Override protected void onDestroy() { super.onDestroy(); unbinder.unbind(); prosenter = null; } @Override public void onCatagorySuccess(Catagory catagory) { List<Catagory.DataBean> data = catagory.getData(); CatagortAdapter adapter = new CatagortAdapter( data ); typeCatagory.setAdapter( adapter ); //默认cid=1的数据 prosenter.getProductCatagory("1" ); adapter.setOnCatagoryLisenter( new CatagortAdapter.OnCatagoryLisenter() { @Override public void onNameClick(int cid) { //调用P层请求子分类 prosenter.getProductCatagory( cid+"" ); } } ); } public void onCatagoryFaild() { Toast.makeText(this, "获得数据失败", Toast.LENGTH_SHORT).show(); } @Override public void onProductCatagorySuccess(ProductCatagory productCatagory) { if (productCatagory.getData().size() ==0){ Toast.makeText(this, "该分类暂时没有商品", Toast.LENGTH_SHORT).show(); }else { List<ProductCatagory.DataBean> data = productCatagory.getData(); ExAdapter adapter = new ExAdapter( data ); typeExl.setAdapter( adapter ); //默认展开所有一级item for (int i = 0;i<data.size();i++){ typeExl.expandGroup( i ); } } } }CatagortAdapter
public class CatagortAdapter extends RecyclerView.Adapter { private List<Catagory.DataBean> list; public CatagortAdapter(List<Catagory.DataBean> list) { this.list = list; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = View.inflate( parent.getContext(),R.layout.caragor_itemy,null ); MViewHolder mViewHolder = new MViewHolder( view ); return mViewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { MViewHolder mViewHolder = (MViewHolder) holder; final Catagory.DataBean bean = list.get( position ); mViewHolder.catagory_name.setText( bean.getName() ); mViewHolder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (onCatagoryLisenter!=null){ onCatagoryLisenter.onNameClick( bean.getCid() ); } } } ); } @Override public int getItemCount() { return list.size(); } class MViewHolder extends RecyclerView.ViewHolder { private final TextView catagory_name; public MViewHolder(View itemView) { super(itemView); catagory_name = itemView.findViewById( R.id.catagory_name); } } public interface OnCatagoryLisenter { void onNameClick(int cid); } private OnCatagoryLisenter onCatagoryLisenter; public void setOnCatagoryLisenter(OnCatagoryLisenter onCatagoryLisenter) { this.onCatagoryLisenter = onCatagoryLisenter; } }ExAdapter
public class ExAdapter extends BaseExpandableListAdapter { private List<ProductCatagory.DataBean> list; public ExAdapter(List<ProductCatagory.DataBean> list) { this.list = list; } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int groupPosition) { return 1; } @Override public Object getGroup(int groupPosition) { return list.get( groupPosition ); } @Override public Object getChild(int groupPosition, int childPosition) { return list.get( groupPosition).getList().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 true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView ==null){ convertView = View.inflate( parent.getContext(), R.layout.group_item,null ); } TextView grouo_name = convertView.findViewById( R.id.group_name ); grouo_name.setText( list.get( groupPosition ).getName() ); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (convertView==null){ convertView = View.inflate( parent.getContext(),R.layout.grid_view,null ); } //二级item加载一个gridview布局 MyGridView grid = convertView.findViewById( R.id.grid ); final List<ProductCatagory.DataBean.ListBean> list = this.list.get( groupPosition ).getList(); grid.setAdapter( new GridAdapter( list ) ); grid.setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent( parent.getContext(),ProductsActivity.class ); intent.putExtra( "pscid",list.get( position ).getPscid() ); parent.getContext().startActivity( intent ); } } ); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } }GridAdapter
public class GridAdapter extends BaseAdapter { private List<ProductCatagory.DataBean.ListBean> list; public GridAdapter(List<ProductCatagory.DataBean.ListBean> list) { 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) { ViewHolder viewHolder; if (convertView ==null){ convertView = View.inflate( parent.getContext(),R.layout.child_item ,null); viewHolder = new ViewHolder( convertView ); convertView.setTag( viewHolder ); }else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.childImg.setImageURI( Uri.parse( list.get( position ).getIcon() ) ); viewHolder.childName.setText( list.get( position ).getName() ); return convertView; } static class ViewHolder { @BindView(R.id.child_img) SimpleDraweeView childImg; @BindView(R.id.child_name) TextView childName; ViewHolder(View view) { ButterKnife.bind(this, view); } } }ProductsActivity
public class ProductsActivity extends AppCompatActivity implements ProductsView{ @BindView(R.id.products_rv) RecyclerView productsRv; private Unbinder unbinder; private ProductsProsenter productsProsenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_products ); unbinder =ButterKnife.bind( this ); initData(); } private void initData() { productsProsenter = new ProductsProsenter( this ); int pscid = getIntent().getIntExtra( "pscid", 0 ); productsRv.setLayoutManager( new LinearLayoutManager( ProductsActivity.this,LinearLayoutManager.VERTICAL,false ) ); productsProsenter.getProducts( pscid+"" ); } @Override public void onSuccess(Products products) { List<Products.DataBean> data = products.getData(); productsRv.setAdapter( new ProductsAdapter( data ) ); } }ProductsAdapter
public class ProductsAdapter extends RecyclerView.Adapter { private List<Products.DataBean> list; private Context context; public ProductsAdapter(List<Products.DataBean> list) { this.list = list; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { context = parent.getContext(); View view = View.inflate( context, R.layout.products, null ); ViewHolder viewHolder = new ViewHolder( view ); return viewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ViewHolder viewHolder = (ViewHolder) holder; final Products.DataBean bean = list.get( position ); String imgUrl = getImgUrl( list.get( position ).getImages() ); viewHolder.productsImg.setImageURI( Uri.parse( imgUrl ) ); viewHolder.productsTitle.setText( bean.getTitle() ); viewHolder.productesYuanjia.setText( "原价 :¥" + bean.getPrice()+"" ); viewHolder.productsXianjia.setText( "现价 :¥"+bean.getBargainPrice()+"" ); viewHolder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { String pid = bean.getPid()+""; Intent intent = new Intent( context, DetailActivity.class ); intent.putExtra( "pid",pid ); context.startActivity( intent ); } } ); } private String getImgUrl(String images){ int i = images.indexOf( "!" ); return images.substring( 0,i ); } @Override public int getItemCount() { return list.size(); } static class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.products_img) SimpleDraweeView productsImg; @BindView(R.id.products_title) TextView productsTitle; @BindView(R.id.productes_yuanjia) TextView productesYuanjia; @BindView(R.id.products_xianjia) TextView productsXianjia; public ViewHolder(View itemView) { super( itemView ); ButterKnife.bind( this,itemView ); productesYuanjia.getPaint().setFlags( Paint.STRIKE_THRU_TEXT_FLAG ); } } }DetailActivity
public class DetailActivity extends AppCompatActivity implements DetailView { @BindView(R.id.datail_banner) Banner datailBanner; @BindView(R.id.detail_price) TextView detailPrice; @BindView(R.id.detail_title) TextView detailTitle; Unbinder unbinder; private Detail.DataBean data; private String pid; private DetailProsenter prosenter; private List<String> path; private String images; private String[] split; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_detail ); unbinder = ButterKnife.bind( this ); initData(); } private void initData() { prosenter = new DetailProsenter( this ); pid = getIntent().getStringExtra( "pid" ); prosenter.geyDetail( pid ); } @Override public void onDetailSuccess(Detail detail) { data = detail.getData(); path = new ArrayList<>( ); images = data.getImages(); split = images.split( "\\|" ); for (int i = 0 ; i<split.length;i++){ path.add( split[i] ); } datailBanner.setImages( path ) .isAutoPlay( true ) .setImageLoader( new MyLoader() ) .start(); detailTitle.setText( data.getTitle() ); detailPrice.setText( "¥"+data.getBargainPrice() ); } }