///utils
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);
}
}
/////////////////////////////////////////////////////////////////////////////////model层
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层
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();
}
});
}
}
////////////////////////////////////////////////////////////////Application
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");
}
}
//////////////////////////////// IContract
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);
}
}
}
/////////////////////////////////////view层
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);
}
}
//////////////adapter包
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);
}
}
}
////////////////////////////////////// Animator
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();
}
}
///////////////////////////第三方
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;
}
}
}
/////////////////////////////////////////////////////////地图
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);
}
}
//////////////////////////////////////////////主界面
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);
}
}