使用的依赖和权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" />
implementation rootProject.ext.dependencies["appcompat-v7"] implementation rootProject.ext.dependencies["constraint-layout"] implementation rootProject.ext.dependencies["retrofit2"] implementation rootProject.ext.dependencies["converter-gson"] implementation rootProject.ext.dependencies["rxjava2"] implementation rootProject.ext.dependencies["rxjava2:rxandroid"] implementation rootProject.ext.dependencies["dagger"] annotationProcessor rootProject.ext.dependencies["dagger-compiler"] implementation rootProject.ext.dependencies["adapter-rxjava"] implementation 'com.facebook.fresco:fresco:0.12.0' // 支持 GIF 动图,需要添加 implementation 'com.facebook.fresco:animated-gif:0.12.0' implementation 'com.android.support:support-v4:27.1.1' implementation 'com.sunfusheng:marqueeview:1.3.3' implementation 'com.jcodecraeer:xrecyclerview:1.3.2' implementation 'com.youth.banner:banner:1.4.10' implementation 'com.android.support:design:27.1.1' implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.github.chrisbanes:PhotoView:2.1.3' implementation 'com.github.bumptech.glide:glide:4.7.1' implementation 'org.greenrobot:eventbus:3.1.1'
build.gradle apply from: "config.gradle"
config.gradle
ext { android = [ compileSdkVersion: 27, applicationId : "com.bwie.test.classifydemo", minSdkVersion : 15, targetSdkVersion : 27, versionCode : 1, versionName : "1.0" ] dependencies = [ "appcompat-v7" : "com.android.support:appcompat-v7:27.1.1", "constraint-layout": "com.android.support.constraint:constraint-layout:1.1.0", "retrofit2" : "com.squareup.retrofit2:retrofit:2.4.0", "converter-gson" : "com.squareup.retrofit2:converter-gson:2.4.0", "adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava2:2.4.0", "rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.13", "rxjava2:rxandroid": "io.reactivex.rxjava2:rxandroid:2.0.2", "dagger" : "com.google.dagger:dagger:2.8", "dagger-compiler" : "com.google.dagger:dagger-compiler:2.7" ] }
activity_classify
<?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=".ClassifyActivity"> <FrameLayout android:id="@+id/fl" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
activity_list_data
<?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" android:orientation="vertical" tools:context=".ListDataActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#d4d2d3" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/ivZxing" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginLeft="15dp" android:background="@drawable/leftjiantou"/> <LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_weight="1" android:background="@drawable/shape_search"> </LinearLayout> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_marginRight="15dp" android:background="@drawable/my_msg_bai"/> </LinearLayout> <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/xrv" android:layout_width="match_parent" android:layout_height="match_parent"> </com.jcodecraeer.xrecyclerview.XRecyclerView> </LinearLayout>
activity_list_details
<?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" android:orientation="vertical" tools:context=".ListDetailsActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#33000000"> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:layout_centerVertical="true" android:layout_marginLeft="15dp" android:background="@drawable/leftjiantou"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="商品详情"/> <ImageView android:id="@+id/ivShare" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="15dp" android:background="@drawable/share"/> </RelativeLayout> <com.youth.banner.Banner android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="200dp"> </com.youth.banner.Banner> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tvPrice" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tvVipPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff0000"/> <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"></View> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <TextView android:id="@+id/tvShopCard" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="购物车"/> <TextView android:id="@+id/tvAddCard" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="#ff0000" android:gravity="center" android:text="加入购物车"/> </LinearLayout> </LinearLayout>
elv_rv
<?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.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </LinearLayout>
fragment_class
<?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="50dp" android:background="#e7e7e7" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/ivZxing" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginLeft="15dp" android:background="@drawable/a_s"/> <LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_weight="1" android:background="@drawable/shape_search"> </LinearLayout> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_marginRight="15dp" android:background="@drawable/my_msg_bai"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <android.support.v7.widget.RecyclerView android:id="@+id/rvLeft" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3"> </android.support.v7.widget.RecyclerView> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="7" android:orientation="vertical"> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="120dp"/> <ExpandableListView android:id="@+id/elv" android:layout_width="match_parent" android:layout_height="match_parent"> </ExpandableListView> </LinearLayout> </LinearLayout> </LinearLayout>
rvclass_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:gravity="center" android:orientation="vertical"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv" android:layout_width="50dp" android:layout_height="50dp"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
rvleft_item
<?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="wrap_content" android:gravity="center"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center"/> </LinearLayout>
rvlist_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="100dp" android:orientation="horizontal"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv" android:layout_width="70dp" android:layout_height="70dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="vertical"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tvPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:textColor="#ff0000"/> </LinearLayout> </LinearLayout>
drawable文件夹下shape_search
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="20dp"></corners> <solid android:color="#ffffff"></solid> </shape>
ClassifyActivity
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.FrameLayout; public class ClassifyActivity extends FragmentActivity { private FrameLayout mFl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_classify); initView(); FragmentManager fragmentManager = getSupportFragmentManager(); ClassifyFragment classifyFragment = new ClassifyFragment(); fragmentManager.beginTransaction() .replace(R.id.fl, classifyFragment) .commit(); } private void initView() { mFl = (FrameLayout) findViewById(R.id.fl); } }
ClassifyFragment
import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ExpandableListView; import android.widget.ImageView; import com.bwie.test.adapter.ElvAdapter; import com.bwie.test.adapter.RvLeftAdapter; import com.bwie.test.bean.CatagoryBean; import com.bwie.test.bean.ProductCatagoryBean; import com.bwie.test.classifydemo.R; import com.bwie.test.classifydemo.base.BaseFragment; import com.bwie.test.classifydemo.contract.ClassifyContract; import com.bwie.test.classifydemo.presenter.ClassifyPresenter; import com.bwie.test.component.DaggerHttpComponent; import com.bwie.test.inter.OnItemClickListener; import com.bwie.test.module.HttpModule; import java.util.ArrayList; import java.util.List; public class ClassifyFragment extends BaseFragment<ClassifyPresenter> implements ClassifyContract.View { private ImageView mIvZxing; private RecyclerView mRvLeft; private ImageView mIv; private ExpandableListView mElv; @Override public int getContentLayout() { return R.layout.fragment_class; } @Override public void inject() { DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); } @Override public void initView(View view) { mIvZxing = (ImageView) view.findViewById(R.id.ivZxing); mRvLeft = (RecyclerView) view.findViewById(R.id.rvLeft); mIv = (ImageView) view.findViewById(R.id.iv); mElv = (ExpandableListView) view.findViewById(R.id.elv); mIv.setBackgroundResource(R.drawable.timg); mPresenter.getCatagory(); } @Override public void getProductCatagorySuccess(ProductCatagoryBean productCatagoryBean) { //定义一个集合用于存放title List<String> groupList = new ArrayList<>(); //定义一个集合用于存放title对应的内容 List<List<ProductCatagoryBean.DataBean.ListBean>> childList = new ArrayList<>(); List<ProductCatagoryBean.DataBean> data = productCatagoryBean.getData(); for (int i = 0; i < data.size(); i++) { groupList.add(data.get(i).getName()); List<ProductCatagoryBean.DataBean.ListBean> list = data.get(i).getList(); childList.add(list); } //使用ExpandableListView展示数据 ElvAdapter elvAdapter = new ElvAdapter(getContext(), groupList, childList); mElv.setAdapter(elvAdapter); //默认展开列表 for (int i = 0; i < groupList.size(); i++) { mElv.expandGroup(i); } productCatagoryBean.getMsg(); } @Override public void getCatagorySuccess(final CatagoryBean catagoryBean) { final List<CatagoryBean.DataBean> data = catagoryBean.getData(); //设置布局管理器 mRvLeft.setLayoutManager(new LinearLayoutManager(getContext())); mRvLeft.addItemDecoration(new DividerItemDecoration(getContext(), RecyclerView.VERTICAL)); //创建适配器 final RvLeftAdapter adapter = new RvLeftAdapter(getContext(), data); //显示左侧列表数据 mRvLeft.setAdapter(adapter); int cid = data.get(0).getCid(); mPresenter.getProductCatagory(cid + ""); //设置第一个为默认选中 adapter.changeCheck(0, true); //设置点击事件 adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { //改变DataBean里面check的属性值 adapter.changeCheck(position, true); //请求右侧对应的数据 mPresenter.getProductCatagory(catagoryBean.getData().get(position).getCid() + ""); } @Override public void onLongItemClick(int position) { } }); } }
ListDataActivity
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.view.View; import android.widget.ImageView; import com.bwie.test.adapter.XrvListAdapter; import com.bwie.test.bean.ProductsBean; import com.bwie.test.classifydemo.base.BaseActivity; import com.bwie.test.classifydemo.contract.ListContract; import com.bwie.test.classifydemo.presenter.ListPresenter; import com.bwie.test.component.DaggerHttpComponent; import com.bwie.test.module.HttpModule; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.ArrayList; import java.util.List; /** * 列表数据展示 */ public class ListDataActivity extends BaseActivity<ListPresenter> implements ListContract.View{ private XRecyclerView mXrv; private int pscid; private boolean isRefresh = true; private XrvListAdapter adapter; public static final int LISTACTIVITY = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐藏原有标题 getSupportActionBar().hide(); //获取pscid Intent intent = getIntent(); pscid = intent.getIntExtra("pscid", 0); initView(); mPresenter.getProducts(pscid + ""); } private void initView() { mXrv = (XRecyclerView) findViewById(R.id.xrv); //设置布局管理器 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); mXrv.setLayoutManager(linearLayoutManager); //设置刷新和加载更多监听 mXrv.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { //刷新 isRefresh = true; mPresenter.getProducts(pscid + ""); } @Override public void onLoadMore() { //加载更多 isRefresh = false; mPresenter.getProducts(pscid + ""); } }); } @Override public int getContentLayout() { return R.layout.activity_list_data; } @Override public void inject() { DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); } @Override public void onSuccess(List<ProductsBean.DataBean> list) { final List<ProductsBean.DataBean> tempList = new ArrayList<>(); tempList.addAll(list); //创建适配器 if (isRefresh) { adapter = new XrvListAdapter(this, list); mXrv.setAdapter(adapter); adapter.refresh(tempList); mXrv.refreshComplete();//设置刷新完成 } else { if (adapter != null) { //判断适配器是否创建过 adapter.loadMore(tempList); mXrv.loadMoreComplete();//设置加载更多完成 } } if (adapter == null) { return; } adapter.setOnListItemClickListener(new XrvListAdapter.OnListItemClickListener() { @Override public void OnItemClick(ProductsBean.DataBean dataBean) { Intent intent = new Intent(ListDataActivity.this, ListDetailsActivity.class); intent.putExtra("bean", dataBean); intent.putExtra("flag", LISTACTIVITY); startActivity(intent); } }); } }
ListDetailsActivity
import android.content.Intent; import android.os.Bundle; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.style.StrikethroughSpan; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bwie.test.bean.AdBean; import com.bwie.test.bean.ProductsBean; import com.bwie.test.classifydemo.base.BaseActivity; import com.bwie.test.classifydemo.contract.AddCartContract; import com.bwie.test.classifydemo.presenter.AddCartPresenter; import com.bwie.test.classifydemo.R; import com.bwie.test.component.DaggerHttpComponent; import com.bwie.test.utils.GlideImageLoader; import com.youth.banner.Banner; import com.youth.banner.listener.OnBannerListener; import java.util.Arrays; public class ListDetailsActivity extends BaseActivity<AddCartPresenter> implements AddCartContract.View, View.OnClickListener{ private ProductsBean.DataBean bean; private Banner mBanner; private TextView mTvTitle; private TextView mTvPrice; private TextView mTvVipPrice; private ImageView mIvShare; /** * 购物车 */ private TextView mTvShopCard; /** * 加入购物车 */ private TextView mTvAddCard; private AdBean.TuijianBean.ListBean listBean; private int flag; private String images; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_details); //获取JavaBean Intent intent = getIntent(); flag = intent.getIntExtra("flag", -1); if (flag == -1) { return; } if (flag == ListDataActivity.LISTACTIVITY) { bean = (ProductsBean.DataBean) intent.getSerializableExtra("bean"); images = bean.getImages(); } else { listBean = (AdBean.TuijianBean.ListBean) intent.getSerializableExtra("bean"); images = listBean.getImages(); } initView(); //设置值 setData(); } private void initView() { mBanner = (Banner) findViewById(R.id.banner); mTvTitle = (TextView) findViewById(R.id.tvTitle); mTvPrice = (TextView) findViewById(R.id.tvPrice); mTvVipPrice = (TextView) findViewById(R.id.tvVipPrice); mIvShare = (ImageView) findViewById(R.id.ivShare); mIvShare.setOnClickListener(this); mTvShopCard = (TextView) findViewById(R.id.tvShopCard); mTvShopCard.setOnClickListener(this); mTvAddCard = (TextView) findViewById(R.id.tvAddCard); mTvAddCard.setOnClickListener(this); } @Override public int getContentLayout() { return R.layout.activity_list_details; } @Override public void inject() { DaggerHttpComponent.builder() .build() .inject(this); } /** * 设置值 */ private void setData() { int money = 0; if (flag == ListDataActivity.LISTACTIVITY) { money = bean.getSalenum(); } else { money = listBean.getSalenum(); } //给原价加横线 SpannableString spannableString = new SpannableString("原价:" + money); StrikethroughSpan strikethroughSpan = new StrikethroughSpan(); spannableString.setSpan(strikethroughSpan, 0, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); mTvPrice.setText(spannableString); mBanner.setOnBannerListener(new OnBannerListener() { @Override public void OnBannerClick(int position) { // Intent intent = new Intent(ListDetailsActivity.this, BannerDetailsActivity.class); // intent.putExtra("imgs", images); // intent.putExtra("position", position); // startActivity(intent); } }); //设置图片加载器 mBanner.setImageLoader(new GlideImageLoader()); String[] imgs = null; if (flag == ListDataActivity.LISTACTIVITY) { imgs = bean.getImages().split("\\|"); mTvTitle.setText(bean.getTitle()); mTvVipPrice.setText("现价:" + bean.getPrice()); } else { imgs = listBean.getImages().split("\\|"); mTvTitle.setText(listBean.getTitle()); mTvVipPrice.setText("现价:" + listBean.getPrice()); } //设置图片集合 mBanner.setImages(Arrays.asList(imgs)); //banner设置方法全部调用完毕时最后调用 mBanner.start(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tvAddCard: //加入购物车登录 break; case R.id.tvShopCard: //跳转到购物车 break; } } @Override public void onSuccess(String str) { Toast.makeText(ListDetailsActivity.this, str, Toast.LENGTH_LONG).show(); } }
base文件夹下BaseActivity
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; import com.bwie.test.inter.IBase; import com.bwie.test.utils.SharedPreferencesUtils; import org.greenrobot.eventbus.EventBus; import javax.inject.Inject; public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends AppCompatActivity implements IBase, BaseContract.BaseView { @Inject protected T mPresenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentLayout()); inject(); //绑定 if (mPresenter != null) { mPresenter.attchView(this); } } @Override public void initView(View view) { } @Override protected void onDestroy() { super.onDestroy(); //解绑 if (mPresenter != null) { mPresenter.detachView(); } } @Override public void showLoading() { } @Override public void dismissLoading() { } protected String getUid() { return (String) SharedPreferencesUtils.getParam(this, "uid", ""); } protected String getToken() { return (String) SharedPreferencesUtils.getParam(this, "token", ""); } protected void toast(String str){ Toast.makeText(this,str,Toast.LENGTH_SHORT).show(); } }
BaseContract
public interface BaseContract { //抽取所有Presenter共性,比如绑定,解绑 interface BasePresenter<T extends BaseView> { void attchView(T view); void detachView(); } //抽取所有View的共性,比如显示进度条和关闭进度 interface BaseView { void showLoading(); void dismissLoading(); } }
BaseFragment
import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.bwie.test.inter.IBase; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.Unbinder; public abstract class BaseFragment<T extends BaseContract.BasePresenter> extends Fragment implements IBase, BaseContract.BaseView { @Inject protected T mPresenter; private Unbinder bind; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); inject(); if (mPresenter != null) { mPresenter.attchView(this); } } @Override public void onDestroy() { super.onDestroy(); if (mPresenter != null) { mPresenter.detachView(); } if (bind != null) { bind.unbind(); } } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(getContentLayout(), null); bind = ButterKnife.bind(getActivity(), view); initView(view); return view; } @Override public void showLoading() { } @Override public void dismissLoading() { } }
BasePresenter
public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> { protected T mView; @Override public void attchView(T view) { this.mView = view; } @Override public void detachView() { if (mView != null) { mView = null; } } }
contract文件夹下ClassifyContract
import com.bwie.test.bean.CatagoryBean; import com.bwie.test.bean.ProductCatagoryBean; import com.bwie.test.classifydemo.base.BaseContract; public interface ClassifyContract { interface View extends BaseContract.BaseView { void getProductCatagorySuccess(ProductCatagoryBean productCatagoryBean); void getCatagorySuccess(CatagoryBean catagoryBean); } interface Presenter extends BaseContract.BasePresenter<View> { void getProductCatagory(String cid); void getCatagory(); } }
ListContract
import com.bwie.test.bean.ProductsBean; import com.bwie.test.classifydemo.base.BaseContract; import java.util.List; public interface ListContract { interface View extends BaseContract.BaseView { void onSuccess(List<ProductsBean.DataBean> list); } interface Presenter extends BaseContract.BasePresenter<View> { void getProducts(String pscid); } }
AddCartContract
import com.bwie.test.classifydemo.base.BaseContract; public interface AddCartContract { interface View extends BaseContract.BaseView { void onSuccess(String str); } interface Presenter extends BaseContract.BasePresenter<View> { void addCart(String uid, String pid, String token); } }
presenter文件夹下ClassifyPresenter
import com.bwie.test.bean.CatagoryBean; import com.bwie.test.bean.ProductCatagoryBean; import com.bwie.test.classifydemo.base.BasePresenter; import com.bwie.test.classifydemo.contract.ClassifyContract; import com.bwie.test.net.CatagoryApi; import com.bwie.test.net.ProductCatagoryApi; import javax.inject.Inject; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class ClassifyPresenter extends BasePresenter<ClassifyContract.View> implements ClassifyContract.Presenter { private ProductCatagoryApi productCatagoryApi; private CatagoryApi catagoryApi; @Inject public ClassifyPresenter(ProductCatagoryApi productCatagoryApi, CatagoryApi catagoryApi) { this.productCatagoryApi = productCatagoryApi; this.catagoryApi = catagoryApi; } @Override public void getProductCatagory(String cid) { productCatagoryApi.getProductCatagory(cid) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer<ProductCatagoryBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ProductCatagoryBean productCatagoryBean) { if (mView != null) { mView.getProductCatagorySuccess(productCatagoryBean); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } @Override public void getCatagory() { catagoryApi.getCatagory() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer<CatagoryBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(CatagoryBean catagoryBean) { if (mView != null) { mView.getCatagorySuccess(catagoryBean); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }
ListPresenter
import com.bwie.test.bean.ProductsBean; import com.bwie.test.classifydemo.base.BasePresenter; import com.bwie.test.classifydemo.contract.ListContract; import com.bwie.test.net.ListApi; import java.util.List; import javax.inject.Inject; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; public class ListPresenter extends BasePresenter<ListContract.View> implements ListContract.Presenter { private ListApi listApi; @Inject public ListPresenter(ListApi listApi) { this.listApi = listApi; } @Override public void getProducts(String pscid) { listApi.getProduct(pscid) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(new Function<ProductsBean, List<ProductsBean.DataBean>>() { @Override public List<ProductsBean.DataBean> apply(ProductsBean productsBean) throws Exception { return productsBean.getData(); } }).subscribe(new Consumer<List<ProductsBean.DataBean>>() { @Override public void accept(List<ProductsBean.DataBean> dataBeans) throws Exception { if (mView != null) { mView.onSuccess(dataBeans); } } }); } }
AddCartPresenter
import com.bwie.test.bean.BaseBean; import com.bwie.test.classifydemo.base.BasePresenter; import com.bwie.test.classifydemo.contract.AddCartContract; import com.bwie.test.net.AddCartApi; import javax.inject.Inject; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; public class AddCartPresenter extends BasePresenter<AddCartContract.View> implements AddCartContract.Presenter { private AddCartApi addCartApi; @Inject public AddCartPresenter(AddCartApi addCartApi) { this.addCartApi = addCartApi; } @Override public void addCart(String uid, String pid, String token) { addCartApi.getCatagory(uid, pid, token) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(new Function<BaseBean, String>() { @Override public String apply(BaseBean baseBean) throws Exception { return baseBean.getMsg(); } }).subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { if (mView != null) { mView.onSuccess(s); } } }); } }
app文件夹下MyApplication
import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); //初始化fresco Fresco.initialize(this); } }
adapter文件夹下ElvAdapter
import android.content.Context; import android.content.Intent; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; import com.bwie.test.bean.ProductCatagoryBean; import com.bwie.test.classifydemo.ListDataActivity; import com.bwie.test.classifydemo.R; import com.bwie.test.inter.OnItemClickListener; import java.util.List; public class ElvAdapter extends BaseExpandableListAdapter { private Context context; private List<String> groupList; private List<List<ProductCatagoryBean.DataBean.ListBean>> childList; private LayoutInflater inflater; public ElvAdapter(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) { //因为二级列表是一个RecylerView,所以返回1即可 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 true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder groupViewHolder; if (convertView == null) { groupViewHolder = new GroupViewHolder(); convertView = inflater.inflate(R.layout.rvleft_item, null); groupViewHolder.tv = convertView.findViewById(R.id.tv); convertView.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) convertView.getTag(); } //显示数据 groupViewHolder.tv.setText(groupList.get(groupPosition)); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder childViewHolder; if (convertView == null) { childViewHolder = new ChildViewHolder(); convertView = inflater.inflate(R.layout.elv_rv, null); childViewHolder.rv = convertView.findViewById(R.id.rv); convertView.setTag(childViewHolder); } else { childViewHolder = (ChildViewHolder) convertView.getTag(); } //显示数据 final List<ProductCatagoryBean.DataBean.ListBean> listBeans = childList.get(groupPosition); //设置布局管理器 childViewHolder.rv.setLayoutManager(new GridLayoutManager(context, 3)); //设置适配器 ElvRvAdapter elvRvAdapter = new ElvRvAdapter(context, listBeans); childViewHolder.rv.setAdapter(elvRvAdapter); elvRvAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { //点击跳转到列表页面 Intent intent = new Intent(context, ListDataActivity.class); int pscid = listBeans.get(position).getPscid(); intent.putExtra("pscid", pscid); context.startActivity(intent); } @Override public void onLongItemClick(int position) { } }); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } class GroupViewHolder { TextView tv; } class ChildViewHolder { RecyclerView rv; } }
ElvRvAdapter
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.LinearLayout; import android.widget.TextView; import com.bwie.test.bean.ProductCatagoryBean; import com.bwie.test.classifydemo.R; import com.bwie.test.inter.OnItemClickListener; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; public class ElvRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<ProductCatagoryBean.DataBean.ListBean> listBeans; private LayoutInflater inflater; private OnItemClickListener onItemClickListener; public ElvRvAdapter(Context context, List<ProductCatagoryBean.DataBean.ListBean> listBeans) { this.context = context; this.listBeans = listBeans; inflater = LayoutInflater.from(context); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.rvclass_item, parent, false); ElvRvAdapterViewHolder elvRvAdapterViewHolder = new ElvRvAdapterViewHolder(view); return elvRvAdapterViewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { ElvRvAdapterViewHolder elvRvAdapterViewHolder = (ElvRvAdapterViewHolder) holder; ProductCatagoryBean.DataBean.ListBean listBean = listBeans.get(position); elvRvAdapterViewHolder.iv.setImageURI(listBean.getIcon()); elvRvAdapterViewHolder.tv.setText(listBean.getName()); //给条目设置点击事件 elvRvAdapterViewHolder.ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick(position); } } }); } @Override public int getItemCount() { return listBeans.size(); } class ElvRvAdapterViewHolder extends RecyclerView.ViewHolder { private final SimpleDraweeView iv; private final TextView tv; private final LinearLayout ll; public ElvRvAdapterViewHolder(View itemView) { super(itemView); ll = itemView.findViewById(R.id.ll); iv = itemView.findViewById(R.id.iv); tv = itemView.findViewById(R.id.tv); } } }
RvLeftAdapter
import android.content.Context; import android.graphics.Color; 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.bwie.test.bean.CatagoryBean; import com.bwie.test.classifydemo.R; import com.bwie.test.inter.OnItemClickListener; import java.util.List; public class RvLeftAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<CatagoryBean.DataBean> list; private LayoutInflater inflater; private OnItemClickListener onItemClickListener; public RvLeftAdapter(Context context, List<CatagoryBean.DataBean> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.rvleft_item, parent, false); LeftViewHolder leftViewHolder = new LeftViewHolder(view); return leftViewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { CatagoryBean.DataBean dataBean = list.get(position); LeftViewHolder leftViewHolder = (LeftViewHolder) holder; leftViewHolder.tv.setText(dataBean.getName()); //设置字体颜色 if (dataBean.isChecked()) { leftViewHolder.tv.setTextColor(Color.RED); leftViewHolder.tv.setBackgroundColor(Color.LTGRAY); } else { leftViewHolder.tv.setTextColor(Color.BLACK); leftViewHolder.tv.setBackgroundColor(Color.WHITE); } leftViewHolder.tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick(position); } } }); } @Override public int getItemCount() { return list.size(); } class LeftViewHolder extends RecyclerView.ViewHolder { private final TextView tv; public LeftViewHolder(View itemView) { super(itemView); tv = itemView.findViewById(R.id.tv); } } /** * 选中后,改变字体颜色和背景色 * @param position * @param bool */ public void changeCheck(int position, boolean bool) { //先还原一下 for (int i = 0;i<list.size();i++){ list.get(i).setChecked(false); } CatagoryBean.DataBean dataBean = list.get(position); dataBean.setChecked(bool); //刷新界面 notifyDataSetChanged(); } }
XrvListAdapter
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.LinearLayout; import android.widget.TextView; import com.bwie.test.bean.ProductsBean; import com.bwie.test.classifydemo.R; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; public class XrvListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<ProductsBean.DataBean> list; private LayoutInflater inflater; private OnListItemClickListener onListItemClickListener; public interface OnListItemClickListener { void OnItemClick(ProductsBean.DataBean dataBean); } public XrvListAdapter(Context context, List<ProductsBean.DataBean> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); } public void setOnListItemClickListener(OnListItemClickListener onListItemClickListener) { this.onListItemClickListener = onListItemClickListener; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.rvlist_item, parent, false); XlvViewHolder xlvViewHolder = new XlvViewHolder(view); return xlvViewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { XlvViewHolder xlvViewHolder = (XlvViewHolder) holder; final ProductsBean.DataBean dataBean = list.get(position); String imgUrl = dataBean.getImages().split("\\|")[0]; // Glide.with(context).load(imgUrl).into(xlvViewHolder.iv); xlvViewHolder.iv.setImageURI(imgUrl); xlvViewHolder.tvTitle.setText(dataBean.getTitle()); xlvViewHolder.tvPrice.setText("¥" + dataBean.getBargainPrice() + ""); //设置条目监听 xlvViewHolder.ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onListItemClickListener != null) { onListItemClickListener.OnItemClick(dataBean); } } }); } @Override public int getItemCount() { return list.size(); } class XlvViewHolder extends RecyclerView.ViewHolder { private final LinearLayout ll; private final SimpleDraweeView iv; private final TextView tvTitle; private final TextView tvPrice; public XlvViewHolder(View itemView) { super(itemView); ll = itemView.findViewById(R.id.ll); iv = itemView.findViewById(R.id.iv); tvTitle = itemView.findViewById(R.id.tvTitle); tvPrice = itemView.findViewById(R.id.tvPrice); } } /** * 刷新 * @param templist */ public void refresh(List<ProductsBean.DataBean> templist) { this.list.clear(); this.list.addAll(templist); notifyDataSetChanged(); } /** * 加载更多 * @param list */ public void loadMore(List<ProductsBean.DataBean> list) { this.list.addAll(list); notifyDataSetChanged(); } }
component文件夹下HttpComponent
import com.bwie.test.classifydemo.ClassifyFragment; import com.bwie.test.classifydemo.ListDataActivity; import com.bwie.test.classifydemo.ListDetailsActivity; import com.bwie.test.module.HttpModule; import dagger.Component; @Component(modules = HttpModule.class) public interface HttpComponent { void inject(ClassifyFragment classifyFragment); void inject(ListDataActivity listDataActivity); void inject(ListDetailsActivity listDetailsActivity); }
inter文件夹下IBase
import android.view.View; public interface IBase { int getContentLayout(); void inject(); void initView(View view); }
OnItemClickListener
public interface OnItemClickListener { void onItemClick(int position); void onLongItemClick(int position); }
module文件夹下HttpModule
import com.bwie.test.net.AddCartApi; import com.bwie.test.net.AddCartApiService; import com.bwie.test.net.Api; import com.bwie.test.net.CatagoryApi; import com.bwie.test.net.CatagoryApiService; import com.bwie.test.net.ListApi; import com.bwie.test.net.ListApiService; import com.bwie.test.net.MyInterceptor; import com.bwie.test.net.ProductCatagoryApi; import com.bwie.test.net.ProductCatagoryApiService; import java.util.concurrent.TimeUnit; import dagger.Module; import dagger.Provides; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; @Module public class HttpModule { @Provides OkHttpClient.Builder provideOkHttpClientBuilder(){ return new OkHttpClient.Builder() .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20,TimeUnit.SECONDS) .connectTimeout(10,TimeUnit.SECONDS); } @Provides CatagoryApi provideCatagoryApi(OkHttpClient.Builder builder) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASEURL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(builder.build()) .build(); CatagoryApiService catagoryApiService = retrofit.create(CatagoryApiService.class); return CatagoryApi.getCatagoryApi(catagoryApiService); } @Provides ProductCatagoryApi provideProductCatagoryApi(OkHttpClient.Builder builder) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASEURL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(builder.build()) .build(); ProductCatagoryApiService productCatagoryApiService = retrofit.create(ProductCatagoryApiService.class); return ProductCatagoryApi.getProductCatagoryApi(productCatagoryApiService); } @Provides ListApi provideListApi(OkHttpClient.Builder builder) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASEURL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(builder.build()) .build(); ListApiService listApiService = retrofit.create(ListApiService.class); return ListApi.getListApi(listApiService); } @Provides AddCartApi provideAddCartApi(OkHttpClient.Builder builder) { builder.addInterceptor(new MyInterceptor()); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASEURL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(builder.build()) .build(); AddCartApiService addCartApiService = retrofit.create(AddCartApiService.class); return AddCartApi.getAddCartApi(addCartApiService); } }
net文件夹下Api
public interface Api { String BASEURL = "https://www.zhaoapi.cn/"; }
MyInterceptor
import java.io.IOException; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //创建一个FormBody.Builder对象,用于添加公共参数 FormBody.Builder builder = new FormBody.Builder(); //先获取原始的请求 Request originalRequest = chain.request(); //获取原始请求里的请求体数据 FormBody formBody = (FormBody) originalRequest.body(); for (int i = 0; i < formBody.size(); i++) { //先把原始的请求体的参数添加到builder里 builder.add(formBody.name(i),formBody.value(i)); } //添加公共参数 builder.add("source","android"); FormBody body = builder.build(); //创建一个新的Request Request request = new Request.Builder() .url(originalRequest.url()) .post(body) .build(); Response response = chain.proceed(request); return response; } }
AddCartApi
import com.bwie.test.bean.BaseBean; import io.reactivex.Observable; public class AddCartApi { private static AddCartApi addCartApi; private AddCartApiService addCartApiService; private AddCartApi(AddCartApiService addCartApiService) { this.addCartApiService = addCartApiService; } public static AddCartApi getAddCartApi(AddCartApiService addCartApiService) { if (addCartApi == null) { addCartApi = new AddCartApi(addCartApiService); } return addCartApi; } public Observable<BaseBean> getCatagory(String uid, String pid, String token) { return addCartApiService.addCart(uid, pid, token); } }
AddCartApiService
import com.bwie.test.bean.BaseBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface AddCartApiService { @FormUrlEncoded @POST("product/addCart") Observable<BaseBean> addCart(@Field("Uid") String uid, @Field("Pid") String pid, @Field("Token") String token); }
CatagoryApi
import com.bwie.test.bean.CatagoryBean; import io.reactivex.Observable; public class CatagoryApi { private static CatagoryApi catagoryApi; private CatagoryApiService catagoryApiService; private CatagoryApi(CatagoryApiService catagoryApiService) { this.catagoryApiService = catagoryApiService; } public static CatagoryApi getCatagoryApi(CatagoryApiService catagoryApiService) { if (catagoryApi == null) { catagoryApi = new CatagoryApi(catagoryApiService); } return catagoryApi; } public Observable<CatagoryBean> getCatagory() { return catagoryApiService.getCatagory(); } }
CatagoryApiService
import com.bwie.test.bean.CatagoryBean; import io.reactivex.Observable; import retrofit2.http.GET; public interface CatagoryApiService { @GET("product/getCatagory") Observable<CatagoryBean> getCatagory(); }
ListApi
import com.bwie.test.bean.ProductsBean; import io.reactivex.Observable; public class ListApi { private static ListApi listApi; private ListApiService listApiService; private ListApi(ListApiService listApiService) { this.listApiService = listApiService; } public static ListApi getListApi(ListApiService listApiService) { if (listApi == null) { listApi = new ListApi(listApiService); } return listApi; } public Observable<ProductsBean> getProduct(String pscid) { return listApiService.getProduct(pscid); } }
ListApiService
import com.bwie.test.bean.ProductsBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface ListApiService { @FormUrlEncoded @POST("product/getProducts") Observable<ProductsBean> getProduct(@Field("pscid") String pscid); }
ProductCatagoryApi
import com.bwie.test.bean.ProductCatagoryBean; import io.reactivex.Observable; public class ProductCatagoryApi { private static ProductCatagoryApi productCatagoryApi; private ProductCatagoryApiService productCatagoryApiService; private ProductCatagoryApi(ProductCatagoryApiService productCatagoryApiService) { this.productCatagoryApiService = productCatagoryApiService; } public static ProductCatagoryApi getProductCatagoryApi(ProductCatagoryApiService productCatagoryApiService) { if (productCatagoryApi == null) { productCatagoryApi = new ProductCatagoryApi(productCatagoryApiService); } return productCatagoryApi; } public Observable<ProductCatagoryBean> getProductCatagory(String cid) { return productCatagoryApiService.getProductCatagory(cid); } }
ProductCatagoryApiService
import com.bwie.test.bean.ProductCatagoryBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface ProductCatagoryApiService { @FormUrlEncoded @POST("product/getProductCatagory") Observable<ProductCatagoryBean> getProductCatagory(@Field("cid") String cid); }
utils文件夹下GlideImageLoader
import android.content.Context; import android.net.Uri; import android.widget.ImageView; import com.facebook.drawee.view.SimpleDraweeView; import com.youth.banner.loader.ImageLoader; public class GlideImageLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { //用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; } }
SharedPreferencesUtils
import android.content.Context; import android.content.SharedPreferences; /** * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 */ public class SharedPreferencesUtils { //保存在手机里面的文件名 private static final String FILE_NAME = "share_date"; /** * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 * @param context * @param key * @param object */ public static void setParam(Context context , String key, Object object){ String type = object.getClass().getSimpleName(); SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); if("String".equals(type)){ editor.putString(key, (String)object); } else if("Integer".equals(type)){ editor.putInt(key, (Integer)object); } else if("Boolean".equals(type)){ editor.putBoolean(key, (Boolean)object); } else if("Float".equals(type)){ editor.putFloat(key, (Float)object); } else if("Long".equals(type)){ editor.putLong(key, (Long)object); } editor.commit(); } /** * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 */ public static Object getParam(Context context , String key, Object defaultObject){ String type = defaultObject.getClass().getSimpleName(); SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); if("String".equals(type)){ return sp.getString(key, (String)defaultObject); } else if("Integer".equals(type)){ return sp.getInt(key, (Integer)defaultObject); } else if("Boolean".equals(type)){ return sp.getBoolean(key, (Boolean)defaultObject); } else if("Float".equals(type)){ return sp.getFloat(key, (Float)defaultObject); } else if("Long".equals(type)){ return sp.getLong(key, (Long)defaultObject); } return null; } }
bean文件夹下AdBean
import java.io.Serializable; import java.util.List; public class AdBean { private String msg; private String code; private TuijianBean tuijian; private MiaoshaBean miaosha; 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 TuijianBean getTuijian() { return tuijian; } public void setTuijian(TuijianBean tuijian) { this.tuijian = tuijian; } public MiaoshaBean getMiaosha() { return miaosha; } public void setMiaosha(MiaoshaBean miaosha) { this.miaosha = miaosha; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class TuijianBean { private String name; private List<ListBean> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<ListBean> getList() { return list; } public void setList(List<ListBean> list) { this.list = list; } public static class ListBean implements Serializable{ private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } public static class MiaoshaBean { private String name; private int time; private List<ListBeanX> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } public List<ListBeanX> getList() { return list; } public void setList(List<ListBeanX> list) { this.list = list; } public static class ListBeanX { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } public static class DataBean { private int aid; private String createtime; private String icon; private Object productId; private String title; private int type; private String url; public int getAid() { return aid; } public void setAid(int aid) { this.aid = aid; } 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 Object getProductId() { return productId; } public void setProductId(Object productId) { this.productId = productId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
BaseBean
public class BaseBean { private String msg; private String code; 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; } }
CatagoryBean
import java.util.List; public class CatagoryBean { 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 { private int cid; private String createtime; private String icon; private int ishome; private String name; private boolean checked;//表示是否选中 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; } } }
ProductCatagoryBean
import java.util.List; public class ProductCatagoryBean { 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 { 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 { 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; } } } }
ProductsBean
import java.io.Serializable; import java.util.List; public class ProductsBean implements Serializable { private String msg; private String code; private String page; 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 String getPage() { return page; } public void setPage(String page) { this.page = page; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean implements Serializable { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }