activity_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="com.bwie.test.fenleiapp.MainActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/xrecycer_view" android:layout_width="match_parent" android:layout_height="match_parent"> </com.jcodecraeer.xrecyclerview.XRecyclerView> </LinearLayout>
activity_goods
<?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="com.bwie.test.fenleiapp.GoodsActivity"> <com.youth.banner.Banner android:id="@+id/banner_goods" android:layout_width="match_parent" android:layout_height="200dp"> </com.youth.banner.Banner> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="15dp" android:layout_above="@id/add_card"> <TextView android:layout_marginTop="5dp" android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银"/> <TextView android:textColor="#f00" android:layout_marginTop="5dp" android:id="@+id/item_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="价格为:5199"/> <TextView android:textColor="#f00" android:layout_marginTop="5dp" android:id="@+id/item_map" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="配送至:"/> </LinearLayout> <TextView android:id="@+id/add_card" android:layout_width="100dp" android:layout_height="50dp" android:gravity="center" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:background="#f00" android:text="立即购买" /> </RelativeLayout> </LinearLayout>
activity_map
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout 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.bwie.test.fenleiapp.MapActivity"> <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.design.widget.CoordinatorLayout>
item_layout
<?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="100dp" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="horizontal"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/simple_view" android:layout_width="100dp" android:layout_height="100dp" fresco:placeholderImage="@mipmap/ic_launcher"/> <LinearLayout android:layout_marginLeft="10dp" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_marginTop="5dp" android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dfsdfdsfdgdfdfd"/> <TextView android:textColor="#f00" android:layout_marginTop="5dp" android:id="@+id/item_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dfsdfdsfdgdfdfd"/> </LinearLayout> </LinearLayout>
MainActivity
import android.content.Intent; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import android.widget.Toast; import com.bwie.test.adapter.MyAdapter; import com.bwie.test.adapter.OnItemClickListener; import com.bwie.test.bean.ListBean; import com.bwie.test.presenter.PresenterChaxun; import com.bwie.test.util.Constant; import com.bwie.test.view.Imain; import com.google.gson.Gson; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; import okhttp3.ResponseBody; public class MainActivity extends AppCompatActivity implements Imain{ @BindView(R.id.xrecycer_view) XRecyclerView xrecycerView; private PresenterChaxun presenterChaxun; private int page = 1; private List<ListBean.DataBean> data = new ArrayList<>(); private Map<String, String> map; private MyAdapter myAdapter; private ListBean listBean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //隐藏原有标题 //getSupportActionBar().hide(); ButterKnife.bind(this); presenterChaxun = new PresenterChaxun(this); map = new HashMap<>(); map.put("keywords","笔记本"); map.put("page", String.valueOf(page)); presenterChaxun.attachView(MainActivity.this); presenterChaxun.getDataFromNet(Constant.CHAXUN_URL, map); xrecycerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL,false)); xrecycerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { data.clear(); // data.addAll(0,listBean.getData()); presenterChaxun.getDataFromNet(Constant.CHAXUN_URL, map); xrecycerView.refreshComplete(); } },2000); } @Override public void onLoadMore() { new Handler().postDelayed(new Runnable() { @Override public void run() { page++; data.addAll(listBean.getData()); presenterChaxun.getDataFromNet(Constant.CHAXUN_URL, map); xrecycerView.refreshComplete(); } },2000); } }); } @Override public void onSuccess(ResponseBody responseBody) { try { String json = responseBody.string(); listBean = new Gson().fromJson(json, ListBean.class); data = listBean.getData(); Log.e("+++++", listBean.getMsg()); setAdapter(); } catch (Exception e) { e.printStackTrace(); } } private void setAdapter() { if (myAdapter==null){ myAdapter=new MyAdapter(MainActivity.this,data); xrecycerView.setAdapter(myAdapter); }else { myAdapter.notifyDataSetChanged(); } //myAdapter = new MyAdapter(MainActivity.this,data); myAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onClick(int position) { int pid = listBean.getData().get(position).getPid(); Intent intent = new Intent(MainActivity.this,GoodsActivity.class); intent.putExtra("pid",pid); startActivity(intent); Toast.makeText(MainActivity.this, "点击了"+(position+1)+"个", Toast.LENGTH_SHORT).show(); } }); } @Override public void onError(Throwable throwable) { Log.e("----",throwable.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); presenterChaxun.unsubcribe(); if (presenterChaxun.isViewAttached()) { presenterChaxun.detachView(); } } }
GoodsActivity
import android.content.Intent; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.bwie.test.bean.GoodsBean; import com.bwie.test.presenter.PresenterGoods; import com.bwie.test.util.Constant; import com.bwie.test.view.GoodsView; import com.google.gson.Gson; import com.youth.banner.Banner; import com.youth.banner.BannerConfig; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import okhttp3.ResponseBody; public class GoodsActivity extends AppCompatActivity implements GoodsView, AMapLocationListener{ @BindView(R.id.banner_goods) Banner bannerGoods; @BindView(R.id.item_title) TextView itemTitle; @BindView(R.id.item_price) TextView itemPrice; @BindView(R.id.add_card) TextView addCard; @BindView(R.id.item_map) TextView itemMap; private PresenterGoods presenterGoods; private Map<String, String> map; private GoodsBean goodsBean; private List<String> list = new ArrayList<>(); private AMapLocationClient mLocationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_goods); //查找控件 ButterKnife.bind(this); presenterGoods = new PresenterGoods(this); Intent intent = getIntent(); int pid = intent.getIntExtra("pid", 0); Log.e("++++----", String.valueOf(pid)); map = new HashMap<>(); map.put("pid", String.valueOf(pid)); presenterGoods.getDataFromNet(Constant.GOODS_URL, map); } @Override public void onSuccess(ResponseBody responseBody) { try { String json = responseBody.string(); goodsBean = new Gson().fromJson(json, GoodsBean.class); String[] split = goodsBean.getData().getImages().split("\\|"); for (String str : split) { list.add(str); } //设置图片加载器 bannerGoods.setImageLoader(new GlideImageLoader()); //设置图片集合 bannerGoods.setImages(list); //设置banner动画效果 //bannerGoods.setBannerAnimation(Transformer.DepthPage); //设置标题集合(当banner样式有显示title时) //设置轮播时间 bannerGoods.setDelayTime(1500); //设置指示器位置(当banner模式中有指示器时) //设置指示器位置(当banner模式中有指示器时) bannerGoods.setIndicatorGravity(BannerConfig.NUM_INDICATOR); //banner设置方法全部调用完毕时最后调用 bannerGoods.start(); itemTitle.setText(goodsBean.getData().getTitle()); itemPrice.setText("价格:" + goodsBean.getData().getPrice() + ""); } catch (Exception e) { e.printStackTrace(); } } @Override public void onError(Throwable throwable) { Log.e("----", throwable.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); presenterGoods.unsubcribe();//解除订阅 if (presenterGoods.isViewAttached()) {//如果产生关联 //解除关联 presenterGoods.detachView(); } } @OnClick({R.id.item_map, R.id.add_card}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.item_map: Intent intent = new Intent(GoodsActivity.this,MapActivity.class); startActivity(intent); mLocationClient = new AMapLocationClient(this); mLocationClient.setLocationListener(this); AMapLocationClientOption mLocationOption = new AMapLocationClientOption(); mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); mLocationOption.setOnceLocation(true); mLocationOption.setOnceLocationLatest(true); mLocationClient.setLocationOption(mLocationOption); //3.启动定位 mLocationClient.startLocation(); break; case R.id.add_card: Toast.makeText(GoodsActivity.this, "价格为:" + goodsBean.getData().getPrice(), Toast.LENGTH_SHORT).show(); break; } } @Override public void onLocationChanged(AMapLocation aMapLocation) { //获取定位的结果 StringBuilder stringBuilder = new StringBuilder(); //stringBuilder.append("经纬度:"+amapLocation.getLatitude()+"--"+amapLocation.getLongitude()); // stringBuilder.append("地址:"+amapLocation.getAddress()+"--"); // stringBuilder.append("地址:"+amapLocation.getCountry()+"--"); // stringBuilder.append("地址:"+amapLocation.getProvince()+"--"); stringBuilder.append("配送至:"+aMapLocation.getCity()+"--"); stringBuilder.append(""+aMapLocation.getDistrict()+"--"); stringBuilder.append(""+aMapLocation.getStreet()+"--"); stringBuilder.append(""+aMapLocation.getStreetNum()+""); itemMap.setText(stringBuilder.toString()); } }
MapActivity
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.amap.api.maps.AMap; import com.amap.api.maps.LocationSource; import com.amap.api.maps.MapView; import com.amap.api.maps.model.MyLocationStyle; import com.bwie.test.fenleiapp.R; public class MapActivity extends AppCompatActivity implements LocationSource, AMapLocationListener { MapView mMapView = null; AMap aMap; OnLocationChangedListener mListener; AMapLocationClient mlocationClient; AMapLocationClientOption mLocationOption; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); mMapView = (MapView) findViewById(R.id.map); //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图 mMapView.onCreate(savedInstanceState); if (aMap == null) { aMap = mMapView.getMap(); } // aMap.setLocationSource(this); //aMap.setMyLocationEnabled(true); //aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE); MyLocationStyle myLocationStyle; myLocationStyle = new MyLocationStyle(); myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE); myLocationStyle.interval(2000); aMap.setMyLocationStyle(myLocationStyle); aMap.getUiSettings().setMyLocationButtonEnabled(true); aMap.setMyLocationEnabled(true); } @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override public void activate(OnLocationChangedListener onLocationChangedListener) { mListener = onLocationChangedListener; if (mlocationClient == null) { //初始化定位 mlocationClient = new AMapLocationClient(this); //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置定位回调监听 mlocationClient.setLocationListener(this); //设置为高精度定位模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //设置定位参数 mlocationClient.setLocationOption(mLocationOption); mlocationClient.startLocation(); } } @Override public void deactivate() { mListener = null; if (mlocationClient != null) { mlocationClient.stopLocation(); mlocationClient.onDestroy(); } mlocationClient = null; } @Override public void onLocationChanged(AMapLocation aMapLocation) { if (mListener != null&& aMapLocation != null) { if (aMapLocation != null &&aMapLocation.getErrorCode() == 0) { mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点 } else { String errText = "定位失败," + aMapLocation.getErrorCode()+ ": " + aMapLocation.getErrorInfo(); Log.e("AmapErr",errText); } } } }
GlideImageLoader
import android.content.Context; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.youth.banner.loader.ImageLoader; public class GlideImageLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { Glide.with(context).load(path).into(imageView); } }
adapter文件夹下MyAdapter
import android.content.Context; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import com.bwie.test.fenleiapp.R; import com.bwie.test.bean.ListBean; import com.bwie.test.adapter.MyHolder; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyHolder>{ Context context; List<ListBean.DataBean> data; private OnItemClickListener mOnItemClickListener; public MyAdapter(Context context, List<ListBean.DataBean> data) { this.context = context; this.data = data; } @Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item_layout, null); MyHolder myHolder = new MyHolder(view); return myHolder; } @Override public void onBindViewHolder(MyHolder holder, final int position) { holder.item_title.setText(data.get(position).getTitle()); holder.item_price.setText("价格:"+data.get(position).getPrice()+""); String[] split = data.get(position).getImages().split("\\|"); Uri uri = Uri.parse(split[0]); holder.simple_view.setImageURI(uri); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); } @Override public int getItemCount() { return data.size(); } public void setOnItemClickListener(OnItemClickListener onItemClickListener ){ this. mOnItemClickListener=onItemClickListener; } }
MyHolder
import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.bwie.test.fenleiapp.R; import com.facebook.drawee.view.SimpleDraweeView; public class MyHolder extends RecyclerView.ViewHolder{ public SimpleDraweeView simple_view; public TextView item_title; public TextView item_price; public MyHolder(View itemView) { super(itemView); simple_view = itemView.findViewById(R.id.simple_view); item_title = itemView.findViewById(R.id.item_title); item_price = itemView.findViewById(R.id.item_price); } }
OnItemClickListener
public interface OnItemClickListener { void onClick(int position); }
MyApplication
import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
model文件夹下ModelChaxun
import com.bwie.test.model.inter.BaseModel; import com.bwie.test.presenter.inter.Ipresenter; import com.bwie.test.presenter.PresenterChaxun; import com.bwie.test.util.RetrofitUtil; import java.util.Map; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; public class ModelChaxun implements BaseModel { private Ipresenter presenterChaInter; private Disposable d; public ModelChaxun(PresenterChaxun presenterChaInter) { this.presenterChaInter = presenterChaInter; } public void getDataFromNet(String url, Map<String, String> map) { RetrofitUtil.getService().doGet(url,map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { ModelChaxun.this.d = d; } @Override public void onNext(ResponseBody responseBody) { presenterChaInter.onSuccess(responseBody); } @Override public void onError(Throwable e) { presenterChaInter.onError(e); } @Override public void onComplete() { } }); } @Override public void unsubcribe() { d.dispose(); } }
ModelGoods
import com.bwie.test.model.inter.GoodsModel; import com.bwie.test.presenter.PresenterGoods; import com.bwie.test.presenter.inter.Ipresentergoods; import com.bwie.test.util.RetrofitUtil; import java.util.Map; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; public class ModelGoods implements GoodsModel{ private Ipresentergoods ipresentergoods; private Disposable d; public ModelGoods(PresenterGoods ipresentergoods) { this.ipresentergoods = ipresentergoods; } public void getDataFromNet(String url, Map<String, String> map) { RetrofitUtil.getService().doGet(url, map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { ModelGoods.this.d = d; } @Override public void onNext(ResponseBody responseBody) { ipresentergoods.onSuccess(responseBody); } @Override public void onError(Throwable e) { ipresentergoods.onError(e); } @Override public void onComplete() { } }); } @Override public void unsubcribe() { d.dispose(); } }
BaseModel
import java.util.Map; public interface BaseModel { void getDataFromNet(String url, Map<String, String> map); void unsubcribe(); }
GoodsModel
import java.util.Map; public interface GoodsModel { void getDataFromNet(String url, Map<String, String> map); void unsubcribe(); }
presenter文件夹下PresenterChaxun
import com.bwie.test.model.ModelChaxun; import com.bwie.test.presenter.base.BasePresenter; import com.bwie.test.presenter.inter.Ipresenter; import com.bwie.test.fenleiapp.MainActivity; import com.bwie.test.view.Imain; import java.util.Map; import okhttp3.ResponseBody; public class PresenterChaxun extends BasePresenter implements Ipresenter { private ModelChaxun modelChaxun; private Imain imain; public PresenterChaxun(MainActivity imain) { this.imain = imain; modelChaxun = new ModelChaxun(this); } public void getDataFromNet(String url, Map<String, String> map) { modelChaxun.getDataFromNet(url,map); } @Override public void unsubcribe() { modelChaxun.unsubcribe(); } @Override public void onSuccess(ResponseBody responseBody) { imain.onSuccess(responseBody); } @Override public void onError(Throwable throwable) { imain.onError(throwable); } }
PresenterGoods
import com.bwie.test.model.ModelGoods; import com.bwie.test.presenter.base.BasePresenterGoods; import com.bwie.test.presenter.inter.Ipresentergoods; import com.bwie.test.fenleiapp.GoodsActivity; import com.bwie.test.view.GoodsView; import java.util.Map; import okhttp3.ResponseBody; public class PresenterGoods extends BasePresenterGoods implements Ipresentergoods{ private ModelGoods modelGoods; private GoodsView goodsView; public PresenterGoods(GoodsActivity goodsView) { this.goodsView = goodsView; modelGoods = new ModelGoods(this); } public void getDataFromNet(String url, Map<String, String> map) { modelGoods.getDataFromNet(url,map); } @Override public void unsubcribe() { modelGoods.unsubcribe(); } @Override public void onSuccess(ResponseBody responseBody) { goodsView.onSuccess(responseBody); } @Override public void onError(Throwable throwable) { goodsView.onError(throwable); } }
Ipresenter
import java.util.Map; import okhttp3.ResponseBody; public interface Ipresenter { void getDataFromNet(String url, Map<String, String> map); void unsubcribe(); void onSuccess(ResponseBody responseBody); void onError(Throwable throwable); }
Ipresentergoods
import java.util.Map; import okhttp3.ResponseBody; public interface Ipresentergoods { void getDataFromNet(String url, Map<String, String> map); void unsubcribe(); void onSuccess(ResponseBody responseBody); void onError(Throwable throwable); }
BasePresenter
import java.lang.ref.Reference; import java.lang.ref.WeakReference; public abstract class BasePresenter<T> { protected Reference<T> mViewRef; public void attachView(T view) { mViewRef = new WeakReference<T>(view); } protected T getView() { return mViewRef.get(); } public boolean isViewAttached() { return mViewRef != null && mViewRef.get() != null; } public void detachView() { if (mViewRef != null) { mViewRef.clear(); mViewRef = null; } } }
BasePresenterGoods
import java.lang.ref.Reference; import java.lang.ref.WeakReference; public abstract class BasePresenterGoods<T> { protected Reference<T> mViewRef;//View接口类型弱引用 public void attachView(T view) { mViewRef = new WeakReference<T>(view); //建立关联 } protected T getView() { return mViewRef.get();//获取View } public boolean isViewAttached() {//判断是否与View建立了关联 return mViewRef != null && mViewRef.get() != null; } public void detachView() {//解除关联 if (mViewRef != null) { mViewRef.clear(); mViewRef = null; } } }
view文件夹下GoodsView
import okhttp3.ResponseBody; public interface GoodsView { void onSuccess(ResponseBody responseBody); void onError(Throwable throwable); }
Imain
import okhttp3.ResponseBody; public interface Imain { void onSuccess(ResponseBody responseBody); void onError(Throwable throwable); }
util文件夹下ApiService;
import java.util.Map; import io.reactivex.Observable; import okhttp3.ResponseBody; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Path; import retrofit2.http.QueryMap; public interface ApiService { @GET("{url}") Observable<ResponseBody> doGet(@Path(value = "url", encoded = true) String url, @QueryMap Map<String, String> map); @FormUrlEncoded @POST("{url}") Observable<ResponseBody> doPost(@Path(value = "url", encoded = true) String url, @FieldMap Map<String, String> map); }
Constant
public class Constant { public static final String BASE_URL = "https://www.zhaoapi.cn"; public static final String CHAXUN_URL="product/searchProducts"; public static final String GOODS_URL="product/getProductDetail"; }
RetrofitUtil
import android.util.Log; import java.io.IOException; import java.util.HashMap; import java.util.Map; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitUtil { private static RetrofitUtil retrofitUtil = null; private Retrofit retrofit; private RetrofitUtil() { } private RetrofitUtil(String baseUrl) { OkHttpClient okHttpClient = new OkHttpClient.Builder() //.addNetworkInterceptor()//网络拦截器 .addInterceptor(new CommonParamsInterceptor())//拦截器 //.connectTimeout()//连接超时 .build(); //创建retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } /** * 单例模式 * @return */ public static RetrofitUtil getInstance(String baseUrl) { if (retrofitUtil == null) { synchronized (RetrofitUtil.class) { if (retrofitUtil == null) { retrofitUtil = new RetrofitUtil(baseUrl); } } } return retrofitUtil; } public <T> T createService(Class<T> service) { return retrofit.create(service); } public static ApiService getService() { return RetrofitUtil.getInstance(Constant.BASE_URL).createService(ApiService.class); } /** * 公共参数的拦截器 */ private static class CommonParamsInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String method = request.method(); String oldUrl = request.url().toString(); Log.e("----oldUrl",oldUrl); Map<String,String> map = new HashMap<>(); map.put("source","android"); if ("GET".equals(method)){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(oldUrl); if (oldUrl.contains("?")){ if (oldUrl.indexOf("?") == oldUrl.length()-1){ }else { stringBuilder.append("&"); } }else { stringBuilder.append("?"); } for (Map.Entry<String,String> entry: map.entrySet()) { stringBuilder.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } if (stringBuilder.indexOf("&") != -1){ stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&")); } String newUrl = stringBuilder.toString(); Log.e("----newUrl",newUrl); request = request.newBuilder().url(newUrl).build(); }else if ("POST".equals(method)){ RequestBody requestBody = request.body(); if (requestBody instanceof FormBody){ FormBody oldBody = (FormBody) requestBody; FormBody.Builder builder = new FormBody.Builder(); for (int i = 0;i<oldBody.size();i++){ builder.add(oldBody.name(i),oldBody.value(i)); } for (Map.Entry<String,String> entry: map.entrySet()) { builder.add(entry.getKey(),entry.getValue()); } request = request.newBuilder().url(oldUrl).post(builder.build()).build(); } } Response response = chain.proceed(request); return response; } } }
使用的方法
<!--允许程序打开网络套接字--> <uses-permission android:name="android.permission.INTERNET" /> <!--允许程序设置内置sd卡的写权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--允许程序获取网络状态--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--允许程序访问WiFi网络信息--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!--允许程序读写手机状态和身份--> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!--允许程序访问CellID或WiFi热点来获取粗略的位置--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!--用于申请调用A-GPS模块--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"> <!--用于申请获取蓝牙信息进行室内定位--> <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission> <application android:name="com.bwie.test.adapter.MyApplication"/> <service android:name="com.amap.api.location.APSService"></service> <meta-data android:name="com.amap.api.v2.apikey" android:value="4a0843d5468b61d772571db0b966e20f"> </meta-data>
使用的依赖
ndk { //设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so) abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "arm64-v8a", "x86_64" }
//添加retrofit依赖 compile 'com.squareup.retrofit2:retrofit:2.3.0' //添加gson转换器的依赖 compile 'com.squareup.retrofit2:converter-gson:2.3.0' //注意 rxjava2是2.0的 不加2表示的是1.0 compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile "io.reactivex.rxjava2:rxjava:2.1.10" compile 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'com.facebook.fresco:fresco:1.8.1'//fresco compile 'com.jcodecraeer:xrecyclerview:1.3.2' //XRecyclerView : implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' //Butterknife compile 'com.youth.banner:banner:1.4.9' //最新版本Banner compile 'com.github.bumptech.glide:glide:3.5.2' //3D地图so及jar compile 'com.amap.api:3dmap:latest.integration' //定位功能 compile 'com.amap.api:location:latest.integration'
bean文件夹下GoodsBean
public class GoodsBean { private String msg; private SellerBean seller; private String code; private DataBean data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public SellerBean getSeller() { return seller; } public void setSeller(SellerBean seller) { this.seller = seller; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public static class SellerBean { private String description; private String icon; private String name; private int productNums; private int score; private int sellerid; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } 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 getProductNums() { return productNums; } public void setProductNums(int productNums) { this.productNums = productNums; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } } public static class DataBean { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private int 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 int getPrice() { return price; } public void setPrice(int 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; } } }
ListBean
public class ListBean { 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 { private int bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private int price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public int getBargainPrice() { return bargainPrice; } public void setBargainPrice(int 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 int getPrice() { return price; } public void setPrice(int 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; } } }