AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.baway.alex.week_test03">
<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" />
<!-- //地图SDK(包含其搜索功能)需要的基础权限 -->
<!-- 允许程序打开网络套接字 -->
<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" />
<!--用于进行网络定位-->
<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>
<application
android:name=".di.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.AnimatorActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activity.MainActivity" />
<activity android:name=".ui.activity.LoginActivity" />
<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:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="487730687e651b3920362d2f8e563a39"></meta-data>
<activity android:name=".ui.activity.MapActivity"></activity>
<service android:name="com.amap.api.location.APSService"></service>
</application>
</manifest>
依赖
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.baway.alex.week_test03"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
//设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "arm64-v8a", "x86_64"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:design:28.+'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
implementation files('libs/umeng-common-1.5.3.jar')
implementation files('libs/umeng-share-core-6.9.3.jar')
implementation files('libs/umeng-share-QQ-simplify-6.9.3.jar')
implementation files('libs/umeng-shareboard-widget-6.9.3.jar')
//3D地图so及jar
implementation 'com.amap.api:3dmap:latest.integration'
//定位功能
implementation 'com.amap.api:location:latest.integration'
//搜索功能
implementation 'com.amap.api:search:latest.integration'
}
Application
package com.baway.alex.week_test03.di;
import android.app.Application;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this,"5b778641f43e48343500019f"
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0");
//豆瓣RENREN平台目前只能在服务器端配置
PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com");
PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf");
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
PlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO");
PlatformConfig.setAlipay("2015111700822536");
PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e");
PlatformConfig.setPinterest("1439206");
PlatformConfig.setKakao("e4f60e065048eb031e235c806b31c70f");
PlatformConfig.setDing("dingoalmlnohc0wggfedpk");
PlatformConfig.setVKontakte("5764965","5My6SNliAaLxEm3Lyd9J");
PlatformConfig.setDropbox("oz8v5apet3arcdy","h7p2pjbzkkxt02a");
}
}
动画类
package com.baway.alex.week_test03.ui.activity;
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.baway.alex.week_test03.R;
import com.baway.alex.week_test03.ui.widget.CircleView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class AnimatorActivity extends AppCompatActivity {
@BindView(R.id.cv_circle)
CircleView cvCircle;
@BindView(R.id.btn_translate)
Button btnTranslate;
@BindView(R.id.btn_scale)
Button btnScale;
@BindView(R.id.btn_rotate)
Button btnRotate;
@BindView(R.id.btn_alpha)
Button btnAlpha;
@BindView(R.id.btn_animator_set)
Button btnAnimatorSet;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animator);
ButterKnife.bind(this);
context = AnimatorActivity.this;
}
@OnClick({R.id.btn_translate, R.id.btn_scale, R.id.btn_rotate, R.id.btn_alpha, R.id.btn_animator_set, R.id.cv_circle})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_translate:
bindAnimator(R.animator.translate_animator);
break;
case R.id.btn_scale:
bindAnimator(R.animator.scale_animator);
break;
case R.id.btn_rotate:
bindAnimator(R.animator.rotate_animator);
break;
case R.id.btn_alpha:
bindAnimator(R.animator.alpha_animator);
break;
case R.id.btn_animator_set:
bindAnimator(R.animator.set_animator);
break;
case R.id.cv_circle:
startActivity(new Intent(this, LoginActivity.class));
break;
}
}
private void bindAnimator(int animatorId) {
Animator animator = AnimatorInflater.loadAnimator(context, animatorId);
animator.setTarget(cvCircle);
animator.start();
}
}
自定义View类
package com.baway.alex.week_test03.ui.widget;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.baway.alex.week_test03.R;
public class CircleView extends View {
private int radius;
private int color;
public CircleView(Context context) {
super(context);
}
public CircleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
for (int i = 0; i < typedArray.length(); i++) {
int index = typedArray.getIndex(i);
switch (i) {
case R.styleable.CircleView_radius:
radius = typedArray.getInt(index, 20);
break;
case R.styleable.CircleView_color:
color = typedArray.getColor(index, Color.GREEN);
break;
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(widthMeasureSpec), getMeasuredHeight(heightMeasureSpec));
}
private int getMeasuredHeight(int heightMeasureSpec) {
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec);
int result = 0;
if (mode == MeasureSpec.AT_MOST) {
result = getPaddingTop() + getPaddingBottom() + 2 * radius;
} else if (mode == MeasureSpec.EXACTLY) {
result = size;
}
return result;
}
private int getMeasuredWidth(int widthMeasureSpec) {
int mode = MeasureSpec.getMode(widthMeasureSpec);
int size = MeasureSpec.getSize(widthMeasureSpec);
int result = 0;
if (mode == MeasureSpec.AT_MOST) {
result = getPaddingLeft() + getPaddingRight() + 2 * radius;
} else if (mode == MeasureSpec.EXACTLY) {
result = size;
}
return result;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(color);
paint.setAntiAlias(true);
canvas.drawCircle(radius, radius, radius, paint);
}
}
自定义View布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".ui.activity.AnimatorActivity">
<com.baway.alex.week_test03.ui.widget.CircleView
android:id="@+id/cv_circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:color="@color/colorRed"
app:radius="60" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/btn_translate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="平移" />
<Button
android:id="@+id/btn_scale"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="缩放" />
<Button
android:id="@+id/btn_rotate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="旋转" />
<Button
android:id="@+id/btn_alpha"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="透明度变化" />
</LinearLayout>
<Button
android:id="@+id/btn_animator_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="动画集合" />
</LinearLayout>
</RelativeLayout>
动画资源xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
></objectAnimator>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="360"
></objectAnimator>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="0"
android:valueTo="100"
></objectAnimator>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"></objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="100"></objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="0"
android:valueTo="2"></objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="scaleY"
android:valueFrom="0"
android:valueTo="2"></objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="600"></objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="translationY"
android:valueFrom="0"
android:valueTo="920"></objectAnimator>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="100"></objectAnimator>
</set>
第三方登录
package com.baway.alex.week_test03.ui.activity;
import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.baway.alex.week_test03.R;
import com.squareup.picasso.Picasso;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.bean.SHARE_MEDIA;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class LoginActivity extends AppCompatActivity {
@BindView(R.id.btn_login)
Button btnLogin;
UMAuthListener authListener = new UMAuthListener() {
/**
* @desc 授权开始的回调
* @param platform 平台名称
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授权成功的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
* @param data 用户资料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
//uid
//name
//gender
//iconurl
String uid = data.get("uid");
final String name = data.get("name");
final String gender = data.get("gender");
final String iconurl = data.get("iconurl");
Toast.makeText(LoginActivity.this, "成功了" + uid + "..." + name + "...." + gender + "..." + iconurl, Toast.LENGTH_LONG).show();
Log.d("LoginActivity", "成功了" + uid + "..." + name + "...." + gender + "..." + iconurl);
runOnUiThread(new Runnable() {
@Override
public void run() {
Picasso.get().load(iconurl).into(ivIcon);
tvGender.setText(gender);
tvNickName.setText(name);
}
});
}
/**
* @desc 授权失败的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
* @param t 错误原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(LoginActivity.this, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授权取消的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
@BindView(R.id.btn_icon)
TextView btnIcon;
@BindView(R.id.iv_icon)
ImageView ivIcon;
@BindView(R.id.tv_gender)
TextView tvGender;
@BindView(R.id.tv_nickName)
TextView tvNickName;
@BindView(R.id.btn_showData)
Button btnShowData;
@BindView(R.id.ll_container)
LinearLayout llContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
if (Build.VERSION.SDK_INT >= 23) {
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE, Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS, Manifest.permission.WRITE_APN_SETTINGS};
ActivityCompat.requestPermissions(this, mPermissionList, 123);
}
}
@OnClick(R.id.btn_login)
public void onViewClicked() {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
}
@OnClick({R.id.btn_login, R.id.iv_icon, R.id.btn_showData})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_login:
btnLogin.setVisibility(View.GONE);
UMShareAPI.get(this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ, authListener);
llContainer.setVisibility(View.VISIBLE);
break;
case R.id.iv_icon:
//TODO
break;
case R.id.btn_showData:
startActivity(new Intent(this, MainActivity.class));
break;
}
}
}
第三方登录布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".ui.activity.LoginActivity">
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击登录QQ" />
<LinearLayout
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="个人信息" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/btn_icon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="9"
android:text="头像" />
<ImageView
android:id="@+id/iv_icon"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@mipmap/ic_launcher" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="9"
android:text="用户名" />
<TextView
android:id="@+id/tv_gender"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@mipmap/ic_launcher"
android:text="userName字段" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="9"
android:text="昵称" />
<TextView
android:id="@+id/tv_nickName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@mipmap/ic_launcher"
android:text="Kson" />
</LinearLayout>
<Button
android:id="@+id/btn_showData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="展示数据" />
</LinearLayout>
</RelativeLayout>
数据展示页面
package com.baway.alex.week_test03.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import com.baway.alex.week_test03.R;
import com.baway.alex.week_test03.data.beans.InfoBean;
import com.baway.alex.week_test03.di.IContract;
import com.baway.alex.week_test03.di.presenter.IPresenterImpl;
import com.baway.alex.week_test03.ui.adapter.SubAdapter;
import com.google.gson.Gson;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity implements IContract.IView {
@BindView(R.id.xrv_container)
XRecyclerView xrvContainer;
private Context context;
private IContract.IPresenter iPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
context = MainActivity.this;
iPresenter = new IPresenterImpl();
iPresenter.attachView(this);
iPresenter.requestInfo();
}
@Override
public void loading() {
}
@Override
public void showData(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Gson gson = new Gson();
InfoBean infoBean = gson.fromJson(msg, InfoBean.class);
final List<InfoBean.DataBean> data = infoBean.getData();
//设置XRecyclerView
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
xrvContainer.setLayoutManager(layoutManager);
//数据展示
SubAdapter subAdapter = new SubAdapter(context, data);
xrvContainer.setAdapter(subAdapter);
subAdapter.setOnItemClickLisenter(new SubAdapter.onItemClickLisenter() {
@Override
public void onItemClick(int layoutPosition) {
//todo
// data.remove(layoutPosition);
// xrvContainer.notifyItemRemoved(data, layoutPosition);
startActivity(new Intent(MainActivity.this, MapActivity.class));
}
});
}
});
}
@Override
public void completed() {
}
@Override
protected void onDestroy() {
super.onDestroy();
iPresenter.detachView(this);
}
}
数据展示页面xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.activity.MainActivity">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/xrv_container"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>
展示页面适配器
package com.baway.alex.week_test03.ui.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.baway.alex.week_test03.R;
import com.baway.alex.week_test03.data.beans.InfoBean;
import com.squareup.picasso.Picasso;
import java.util.List;
public class SubAdapter extends RecyclerView.Adapter<SubAdapter.SubViewHolder> {
onItemClickLisenter onItemClickLisenter;
public interface onItemClickLisenter {
void onItemClick(int layoutPosition);
}
public void setOnItemClickLisenter(onItemClickLisenter onItemClickLisenter) {
this.onItemClickLisenter = onItemClickLisenter;
}
List<InfoBean.DataBean> data;
Context context;
public SubAdapter(Context context, List<InfoBean.DataBean> data) {
this.data = data;
this.context = context;
}
@NonNull
@Override
public SubViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View rootView = LayoutInflater.from(context).inflate(R.layout.recycler_item, viewGroup, false);
SubViewHolder subViewHolder = new SubViewHolder(rootView);
return subViewHolder;
}
@Override
public void onBindViewHolder(@NonNull SubViewHolder subViewHolder, int position) {
String[] images = data.get(position).getImages().split("\\|");
Picasso.get().load(images[0]).into(subViewHolder.iv_item_icon);
subViewHolder.tv_showInfo.setText(data.get(position).getCreatetime());
}
@Override
public int getItemCount() {
return data.size();
}
class SubViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ImageView iv_item_icon;
private TextView tv_showInfo;
public SubViewHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(this);
iv_item_icon = itemView.findViewById(R.id.iv_item_icon);
tv_showInfo = itemView.findViewById(R.id.tv_showInfo);
}
@Override
public void onClick(View v) {
Log.d("SubViewHolder", "getLayoutPosition():" + getLayoutPosition());
onItemClickLisenter.onItemClick(getLayoutPosition()-1);
}
}
}
适配器布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/tv_showInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:text="展示条目" />
</RelativeLayout>
高德地图
package com.baway.alex.week_test03.ui.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.MapView;
import com.baway.alex.week_test03.R;
public class MapActivity extends AppCompatActivity {
MapView mMapView = null;
//初始化地图控制器对象
AMap aMap;
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
//声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
Log.e("AmapSuccess", "location Error, ErrCode:"
+ aMapLocation.getLatitude() + ", errInfo:"
+ aMapLocation.getLongitude());
} else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}
};
@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);
//定义了一个地图view
mMapView.onCreate(savedInstanceState);// 此方法须覆写,虚拟机需要在很多情况下保存地图绘制的当前状态。
if (aMap == null) {
aMap = mMapView.getMap();
}
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
}
基类
package com.baway.alex.week_test03.di;
public interface IContract {
public interface IView {
void loading();
void showData(String msg);
void completed();
}
public interface IPresenter<IView> {
void attachView(IView iView);
void detachView(IView iView);
void requestInfo();
}
public interface IModel {
void requestData(onCallBackLisenter onCallBackLisenter);
interface onCallBackLisenter {
void onCallBack(String msg);
}
}
}
Model层
package com.baway.alex.week_test03.di.model;
import com.baway.alex.week_test03.data.utils.OKHttpUtil;
import com.baway.alex.week_test03.di.IContract;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class IModelImpl implements IContract.IModel {
public static final String URL = "http://www.zhaoapi.cn/product/searchProducts?keywords=%E6%89%8B%E6%9C%BA&page=1&sort=0";
@Override
public void requestData(final onCallBackLisenter onCallBackLisenter) {
OKHttpUtil.getInstance().get(URL, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
String errorMsg = e.getMessage().toString();
onCallBackLisenter.onCallBack(errorMsg);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseString = response.body().string().toString();
onCallBackLisenter.onCallBack(responseString);
}
});
}
}
Presenter层
package com.baway.alex.week_test03.di.presenter;
import com.baway.alex.week_test03.di.IContract;
import com.baway.alex.week_test03.di.model.IModelImpl;
import com.baway.alex.week_test03.ui.activity.MainActivity;
import java.lang.ref.WeakReference;
public class IPresenterImpl implements IContract.IPresenter<IContract.IView> {
IContract.IView iView;
private IContract.IModel iModel;
private WeakReference<IContract.IView> viewWeakReference;
private WeakReference<IContract.IModel> modelWeakReference;
@Override
public void attachView(IContract.IView iView) {
this.iView = iView;
iModel = new IModelImpl();
viewWeakReference = new WeakReference<>(iView);
modelWeakReference = new WeakReference<>(iModel);
}
@Override
public void detachView(IContract.IView iView) {
viewWeakReference.clear();
modelWeakReference.clear();
}
@Override
public void requestInfo() {
iView.loading();
iModel.requestData(new IContract.IModel.onCallBackLisenter() {
@Override
public void onCallBack(String msg) {
iView.showData(msg);
iView.completed();
}
});
}
}
网络请求工具类
package com.baway.alex.week_test03.data.utils;
import java.io.File;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class OKHttpUtil {
public static OKHttpUtil instance;
public OkHttpClient okHttpClient;
//私有化构造函数,阻止其他类内容new关键字创建对象
private OKHttpUtil() {
//tip:获取OKHttp对象
if (null == okHttpClient) {
synchronized (OkHttpClient.class) {
if (null == okHttpClient) {
//okHttpClient = new OkHttpClient();
//添加缓存拦截器
okHttpClient = new OkHttpClient
.Builder()
.build();
}
}
}
}
//获取工具类对象
public static OKHttpUtil getInstance() {
//DCL双重检测锁获取实例对象
if (null == instance) {
//用锁防止多线程高并发的访问
synchronized (OKHttpUtil.class) {
if (null == instance) {
instance = new OKHttpUtil();
}
}
}
return instance;
}
/**
* get请求的封装
*
* @param urlString url地址
* @param callback 请求回调
*/
public void get(String urlString, Callback callback) {
Request request = new Request.Builder().url(urlString).build();
okHttpClient.newCall(request).enqueue(callback);
}
public void post(String urlString, FormBody formBody, Callback callback) {
Request request = new Request.Builder().method("POST", formBody).url(urlString).build();
okHttpClient.newCall(request).enqueue(callback);
}
}