购物送至高德显示

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值