需要導入依賴
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '28.0.0'
}
}
}
}
implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
佈局文件
<?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=".MainActivity"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="horizontal"
android:id="@+id/LL"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Image"
android:src="@mipmap/ic_launcher"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Tv"
android:text="暱稱"
android:layout_toRightOf="@+id/Image"
android:layout_marginLeft="20dp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/San_Btn"
android:text="登錄"
android:layout_alignParentRight="true"
android:focusable="false"
/>
</RelativeLayout>
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/Recy_Lv"
android:layout_below="@+id/LL"
>
</com.jcodecraeer.xrecyclerview.XRecyclerView>
</RelativeLayout>
MVP佈局
IView接口
package com.example.sanzhoumoni.view;
public interface IView<T> {
void success(T data);
void error(T error);
}
Model接口
package com.example.sanzhoumoni.model;
import com.example.sanzhoumoni.callback.MyCallBack;
public interface Model {
void getData(String url, MyCallBack callBack);
}
package com.example.sanzhoumoni.model;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import com.example.sanzhoumoni.MainActivity;
import com.example.sanzhoumoni.bean.MyData;
import com.example.sanzhoumoni.callback.MyCallBack;
import com.example.sanzhoumoni.utils.OkHttpUtils;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ModelImpl implements Model {
private MyCallBack callBack;
@Override
public void getData(String url, MyCallBack callBack) {
this.callBack=callBack;
new MyTask().execute(url);
}
class MyTask extends AsyncTask<String,Void,MyData> {
@Override
protected MyData doInBackground(String... strings) {
try {
String jsonStr = OkHttpUtils.getInstance().get(strings[0]);
Gson gson=new Gson();
MyData myData = gson.fromJson(jsonStr, MyData.class);
Log.e("aaaa",myData.getMsg());
return myData;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(MyData myData) {
super.onPostExecute(myData);
callBack.setData(myData);
}
}
}
IPresenter接口
package com.example.sanzhoumoni.presenter;
public interface IPresenter {
void starRequse(String url);
}
package com.example.sanzhoumoni.presenter;
import com.example.sanzhoumoni.callback.MyCallBack;
import com.example.sanzhoumoni.model.ModelImpl;
import com.example.sanzhoumoni.view.IView;
public class PresenterImpl implements IPresenter {
private ModelImpl model;
private IView iView;
public PresenterImpl(IView iView) {
this.iView = iView;
model=new ModelImpl();
}
@Override
public void starRequse(final String url) {
model.getData(url, new MyCallBack() {
@Override
public void setData(Object user) {
iView.success(user);
}
@Override
public void setError(Object error) {
iView.error(error);
}
});
}
}
MyCallBack接口
package com.example.sanzhoumoni.callback;
public interface MyCallBack<T> {
void setData(T user);
void setError(T error);
}
MyAdapter適配器
package com.example.sanzhoumoni.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.bumptech.glide.Glide;
import com.example.sanzhoumoni.R;
import com.example.sanzhoumoni.bean.MyData;
import java.util.ArrayList;
import java.util.Random;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener{
private ArrayList<MyData.DataBean> mList;
private Context mContext;
public MyAdapter(ArrayList<MyData.DataBean> mList, Context mContext) {
this.mList = mList;
this.mContext = mContext;
}
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view= LayoutInflater.from(mContext).inflate(R.layout.beauty_item,viewGroup,false);
ViewHolder holder=new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.ViewHolder viewHolder, int i) {
MyData.DataBean dataBean= mList.get(i);
ViewGroup.LayoutParams params= viewHolder.itemView.getLayoutParams();
Random random=new Random();
int height= random.nextInt(300)+300;
params.height=height;
viewHolder.itemView.setLayoutParams(params);
viewHolder.textView.setText(dataBean.getAuthor_name());
Glide.with(mContext).load(dataBean.getThumbnail_pic_s()).into(viewHolder.imageView);
viewHolder.itemView.setTag(i);
}
@Override
public int getItemCount() {
return mList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView= itemView.findViewById(R.id.Text_View);
imageView=itemView.findViewById(R.id.Beauty_Image);
}
}
public interface ItemClick{
void setOnItem(View v,int position);
}
private ItemClick itemClick;
public void setOnItemClick(ItemClick itemClick){
this.itemClick=itemClick;
}
@Override
public void onClick(View v) {
if(itemClick!=null){
itemClick.setOnItem(v, (Integer) v.getTag());
}
}
}
MyApp 第三方登錄用的
package com.example.sanzhoumoni.app;
import android.app.Application;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this, "5a12384aa40fa3551f0001d1"
, "umeng", UMConfigure.DEVICE_TYPE_PHONE, "");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
//開啓log打印 報錯會給你提示
UMConfigure.setLogEnabled(true);
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");
}
}
OkHttpUtils工具類
package com.example.sanzhoumoni.utils;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpUtils {
private OkHttpClient okHttpClient;
private OkHttpUtils(){
okHttpClient=new OkHttpClient();
}
public static OkHttpUtils getInstance(){
return okHttpHolde.utils;
}
static class okHttpHolde{
private static final OkHttpUtils utils=new OkHttpUtils();
}
public String get(String url) throws IOException {
Request request=new Request.Builder().url(url).build() ;
Response execute = okHttpClient.newCall(request).execute();
return execute.body().string();
}
}
MainActivity主頁面
package com.example.sanzhoumoni;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.sanzhoumoni.adapter.MyAdapter;
import com.example.sanzhoumoni.bean.MyData;
import com.example.sanzhoumoni.presenter.PresenterImpl;
import com.example.sanzhoumoni.view.IView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareConfig;
import com.umeng.socialize.bean.SHARE_MEDIA;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements IView {
private ImageView Image;
private TextView Tv;
private Button San_Btn;
private XRecyclerView Recy;
private String mUrl="http://www.xieast.com/api/news/news.php?page=";
private ArrayList<MyData.DataBean> mLsit=new ArrayList<>();
private MyAdapter adapter;
private int index=1;
private PresenterImpl presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
presenter = new PresenterImpl(this);
adapter = new MyAdapter(mLsit,this);
Recy.setAdapter(adapter);
presenter.starRequse(mUrl+index);
// Toast.makeText(this,mLsit.toString(),Toast.LENGTH_SHORT).show();
Image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ObjectAnimator animator=ObjectAnimator.ofFloat(Image,"scaleX",4f,1f);
ObjectAnimator alp=ObjectAnimator.ofFloat(Image,"alpha",1f,0f,1f);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.play(animator).with(alp);
animatorSet.setDuration(5000);
animatorSet.start();
}
});
//條目點擊屬性動畫
adapter.setOnItemClick(new MyAdapter.ItemClick() {
@Override
public void setOnItem(View v, int position) {
Toast.makeText(MainActivity.this,mLsit.get(position).getAuthor_name(),Toast.LENGTH_SHORT).show();
ObjectAnimator alp=ObjectAnimator.ofFloat(v,"alpha",1f,0f,1f);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.play(alp);
animatorSet.setDuration(5000);
animatorSet.start();
}
});
//第三方登錄
San_Btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UMShareConfig shareConfig = new UMShareConfig();
shareConfig.isNeedAuthOnGetUserInfo(true);
UMShareAPI.get(MainActivity.this).setShareConfig(shareConfig);
UMShareAPI.get(MainActivity.this).getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, authListener);
}
});
//上拉加載/下拉刷新
Recy.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
index=1;
mLsit.clear();
presenter.starRequse(mUrl+index);
}
@Override
public void onLoadMore() {
index++;
presenter.starRequse(mUrl+index);
}
});
}
private void initView() {
Image = (ImageView) findViewById(R.id.Image);
Tv = (TextView) findViewById(R.id.Tv);
San_Btn = (Button) findViewById(R.id.San_Btn);
// Recy = (RecyclerView) findViewById(R.id.Recy);
Recy= findViewById(R.id.Recy_Lv);
//瀑布流佈局
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
Recy.setLayoutManager(staggeredGridLayoutManager);
Recy.setItemAnimator(new DefaultItemAnimator());
}
//成功回調
@Override
public void success(Object data) {
MyData myData= (MyData) data;
mLsit.addAll(myData.getData());
adapter.notifyDataSetChanged();
Recy.refreshComplete();
Recy.loadMoreComplete();
}
@Override
public void error(Object error) {
}
//登陸監聽
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) {
Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
String name = data.get("name");
//String img = data.get("profile_image_url");
Tv.setText(name);
//Log.e("aaaaaaaaaaaaa",data.toString());
Glide.with(MainActivity.this).load(data.get("profile_image_url")).into(Image);
}
/**
* @desc 授權失敗的回調
* @param platform 平臺名稱
* @param action 行爲序號,開發者用不上
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(MainActivity.this, "失敗:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授權取消的回調
* @param platform 平臺名稱
* @param action 行爲序號,開發者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(MainActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
}