动画+友盟第三方登录+数据展示+高德地图

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);
    }
}

猜你喜欢

转载自blog.csdn.net/chy521xin/article/details/81841331