----------model
package bwie.com.moni320180914.di.model; import java.io.IOException; import bwie.com.moni320180914.data.utils.OkHttpUtil; import bwie.com.moni320180914.di.IContract; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.Response; public class ModelImpl implements IContract.IModel{ private static final String URL="https://restapi.amap.com/v3/place/around?key=d78f39012867929dc6ad174dd498f51f&location=116.473168,39.993015&keywords=%E7%BE%8E%E9%A3%9F&types=&radius=1000&offset=20&page=1&extensions=all"; private static final String BASE_URL = "https://restapi.amap.com/v3/place/around"; @Override public void requestData(final onCallBacklisenter onCallBacklisenter) { OkHttpUtil.getInstance().get(URL, new Callback() { @Override public void onFailure(Call call, IOException e) { String estring = e.getMessage().toString(); onCallBacklisenter.stringMsg(estring); } @Override public void onResponse(Call call, Response response) throws IOException { String responseString = response.body().string(); onCallBacklisenter.stringMsg(responseString); } }); } @Override public void requestDataPost(String keyworkd,final onCallBacklisenter onCallBacklisenter) { FormBody formBody = new FormBody.Builder() .add("key","d78f39012867929dc6ad174dd498f51f") .add("location","116.473168,39.993015") .add("keywords",keyworkd) .add("types","") .add("radius","1000") .add("offset","20") .add("page","1") .add("extensions","all") .build(); OkHttpUtil.getInstance().post(BASE_URL, formBody, new Callback() { @Override public void onFailure(Call call, IOException e) { String estring = e.getMessage().toString(); onCallBacklisenter.stringMsg(estring); } @Override public void onResponse(Call call, Response response) throws IOException { String responseString = response.body().string(); onCallBacklisenter.stringMsg(responseString); } }); } }
---presenter
package bwie.com.moni320180914.di.presenter; import java.lang.ref.WeakReference; import bwie.com.moni320180914.di.IContract; import bwie.com.moni320180914.di.model.ModelImpl; public class PresenterImpl implements IContract.IPersenter<IContract.IView> { IContract.IView iView; private IContract.IModel iModel; private WeakReference<IContract.IView> iViewWeakReference; private WeakReference<IContract.IModel> iModelWeakReference; @Override public void AttData(IContract.IView iView) { this.iView = iView; iModel = new ModelImpl(); iViewWeakReference = new WeakReference<>(iView); iModelWeakReference = new WeakReference<>(iModel); } @Override public void DeleteData(IContract.IView iView) { iViewWeakReference.clear(); iModelWeakReference.clear(); } @Override public void infoData() { iModel.requestData(new IContract.IModel.onCallBacklisenter() { @Override public void stringMsg(String Msg) { iView.showData(Msg); } }); } @Override public void infoPost(String keywords) { iModel.requestDataPost(keywords,new IContract.IModel.onCallBacklisenter() { @Override public void stringMsg(String Msg) { iView.showData(Msg); } }); } }
接口 icontract
public interface IContract { interface IView{ void showData(String msg); } interface IPersenter<IView>{ void AttData(IView iView); void DeleteData(IView iView); void infoData(); void infoPost(String keywords); } interface IModel{ interface onCallBacklisenter{ void stringMsg(String Msg); } void requestData(onCallBacklisenter onCallBacklisenter); void requestDataPost(String keywords, onCallBacklisenter onCallBacklisenter); }
---view
package bwie.com.moni320180914.ui.activity; import android.Manifest; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageView; 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.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.gson.Gson; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import bwie.com.moni320180914.R; import bwie.com.moni320180914.data.bean.InfoBean; import bwie.com.moni320180914.di.IContract; import bwie.com.moni320180914.di.presenter.PresenterImpl; import bwie.com.moni320180914.ui.adapter.MainAdapters; public class MainActivity extends AppCompatActivity implements IContract.IView, AMapLocationListener { private static final int REQUST_CODE_LOGIN = 1000; @BindView(R.id.m_search) ImageView mSearch; @BindView(R.id.main_mao) ImageView mainMao; @BindView(R.id.reacycle_view) RecyclerView reacycleView; @BindView(R.id.et_search) EditText etSearch; @BindView(R.id.tv_location) TextView tvLocation; private IContract.IPersenter iPersenter; private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_WIFI_STATE}, 200); } initLocation(); ButterKnife.bind(this); iPersenter = new PresenterImpl(); iPersenter.AttData(this); // iPersenter.infoData(); iPersenter.infoPost("美食"); recyclerView = findViewById(R.id.reacycle_view); } @Override public void showData(final String msg) { Log.i("aa", "showData: " + msg); runOnUiThread(new Runnable() { @Override public void run() { Gson gson = new Gson(); InfoBean infoBean = gson.fromJson(msg, InfoBean.class); List<InfoBean.Pois> data = infoBean.getPois(); LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); MainAdapters mainAdapter = new MainAdapters(data, MainActivity.this); recyclerView.setAdapter(mainAdapter); } }); } @Override protected void onDestroy() { super.onDestroy(); iPersenter.DeleteData(this); } @OnClick({R.id.m_search, R.id.main_mao,R.id.tv_location}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.m_search: String keywords = etSearch.getText().toString(); if (!TextUtils.isEmpty(keywords)) { iPersenter.infoPost(keywords); } // iPersenter.infoPost(); break; case R.id.main_mao: Intent intent = new Intent(MainActivity.this, LoginActivity.class); // startActivity(intent); startActivityForResult(intent, REQUST_CODE_LOGIN); break; case R.id.tv_location: mlocationClient.startLocation(); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUST_CODE_LOGIN && resultCode == RESULT_OK) { String iconurl = data.getStringExtra("iconurl"); // Picasso.with(this).load(iconurl).into(mainMao); Glide.with(this).load(iconurl).apply(new RequestOptions().circleCrop()).into(mainMao); } } //声明mLocationOption对象 public AMapLocationClientOption mLocationOption = null; //声明mlocationClient对象 public AMapLocationClient mlocationClient; private void initLocation() { //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置返回地址信息,默认为true mLocationOption.setNeedAddress(true); mlocationClient = new AMapLocationClient(this); //设置定位监听 mlocationClient.setLocationListener(this); //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setInterval(10000); //设置定位参数 mlocationClient.setLocationOption(mLocationOption); // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, // 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求 // 在定位结束后,在合适的生命周期调用onDestroy()方法 // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除 //启动定位 } @Override public void onLocationChanged(AMapLocation amapLocation) { if (amapLocation != null) { if (amapLocation.getErrorCode() == 0) { //定位成功回调信息,设置相关消息 amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表 amapLocation.getLatitude();//获取纬度 amapLocation.getLongitude();//获取经度 amapLocation.getAccuracy();//获取精度信息 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(amapLocation.getTime()); df.format(date);//定位时间 String address = amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。 String country = amapLocation.getCountry();//国家信息 amapLocation.getProvince();//省信息 amapLocation.getCity();//城市信息 amapLocation.getDistrict();//城区信息 amapLocation.getStreet();//街道信息 amapLocation.getStreetNum();//街道门牌号信息 amapLocation.getCityCode();//城市编码 amapLocation.getAdCode();//地区编码 // amapLocation.getAOIName();//获取当前定位点的AOI信息 //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 Log.e("AmapSuccess","address:" + address + ", country:" + country); Toast.makeText(this, "address:" + address + ", country:" + country, Toast.LENGTH_SHORT).show(); tvLocation.setText(address); } else { //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 Log.e("AmapError","location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo()); } } } }
---adapter
package bwie.com.moni320180914.ui.adapter; 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.ImageView; import android.widget.TextView; import com.squareup.picasso.Picasso; import java.util.List; import bwie.com.moni320180914.R; import bwie.com.moni320180914.data.bean.InfoBean; public class MainAdapters extends RecyclerView.Adapter<MainAdapters.ViewHolder> { List<InfoBean.Pois> data; Context context; private ViewHolder viewHolder; public MainAdapters(List<InfoBean.Pois> data, Context context) { this.data = data; this.context = context; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.activity_list, parent, false); viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.listtitie.setText(data.get(position).getName()); holder.listtupiao.setText(data.get(position).getDistance() + "m"); List<InfoBean.Pois.Photo> photos = data.get(position).getPhotos(); if (photos != null && photos.size() > 0) { Picasso.with(context).load(photos.get(0).getUrl()).into(holder.imageView); } } @Override public int getItemCount() { return data.size(); } class ViewHolder extends RecyclerView.ViewHolder { private ImageView imageView; private TextView listtitie; private TextView listtupiao; public ViewHolder(View itemView) { super(itemView); imageView = itemView.findViewById(R.id.list_img); listtitie = itemView.findViewById(R.id.list_title); listtupiao = itemView.findViewById(R.id.list_tupiao); } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="bwie.com.moni320180914"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:name=".data.App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".ui.activity.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ui.activity.LoginActivity" /> <activity android:name=".ui.activity.MapActivity"></activity> <activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tencent100424468" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize"/> <meta-data android:name="com.amap.api.v2.apikey" android:value="f81113feabf3031ac8af72c9ecdaccb6"/> <service android:name="com.amap.api.location.APSService"></service> </application> <!--用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!--用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!--用于获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!--用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!--用于访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <!--用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!--用于写入缓存数据到扩展存储卡--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!--用于申请调用A-GPS模块--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission> <!--用于申请获取蓝牙信息进行室内定位--> <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission> </manifest>