依赖包
apply plugin:'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.example.adminjs.zhaokaoer"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:25.+'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.jakewharton:butterknife:7.0.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.liaoinstan.springview:library:1.3.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:recyclerview-v7:25.3.1'
}
activity_main.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<com.liaoinstan.springview.widget.SpringView
android:id="@+id/springview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</com.liaoinstan.springview.widget.SpringView>
</LinearLayout>
item1.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:id="@+id/list_item1_imageview"/>
<TextView
android:padding="25dp"
android:text="aaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list_item1_textview"/>
</LinearLayout>
**MainActivity页面**
package com.example.adminjs.zhaokaoer;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import com.example.adminjs.zhaokaoer.presenter.MultilActivityPresenter;
import com.liaoinstan.springview.container.DefaultFooter;
import com.liaoinstan.springview.container.DefaultHeader;
import com.liaoinstan.springview.widget.SpringView;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends Activity implements MultiView {
@Bind(R.id.recyclerview)
RecyclerView recyclerview;
@Bind(R.id.springview)
SpringView springview;
private MultilActivityPresenter presenter;
private MultilActivityAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
presenter = new MultilActivityPresenter(this);
adapter = new MultilActivityAdapter(this);
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerview.setLayoutManager(manager);
recyclerview.setAdapter(adapter);
springview.setHeader(new DefaultHeader(this));
springview.setFooter(new DefaultFooter(this));
springview.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
presenter.onRefresh(true);
}
@Override
public void onLoadmore() {
presenter.onRefresh(false);
}
});
presenter.onRefresh(true);
}
@Override
public void success(MultiBean bean) {
if (springview != null) {
springview.onFinishFreshAndLoad();
}
adapter.addData(bean.getResult().getList());
}
@Override
public void failure(Exception e) {
Toast.makeText(this, " error ", Toast.LENGTH_SHORT).show();
}
}
M(MuItilActivityModule页面)
package com.example.adminjs.zhaokaoer.module;
import com.example.adminjs.zhaokaoer.MultiBean;
import com.example.adminjs.zhaokaoer.okhttp.AbstractUiCallBack;
import com.example.adminjs.zhaokaoer.okhttp.OkhttpUtils;
/**
* Created by Adminjs on 2017/11/10.
*/
public class MuItilActivityModule {
public void onRefresh(boolean up, final ModuleCallBack callBack) {
OkhttpUtils.getInstance().asy(null, "http://v.juhe.cn/weixin/query?key=88f7bbc507e3ecacfaeab2b47dd8936f", new AbstractUiCallBack<MultiBean>() {
@Override
public void success(MultiBean bean) {
callBack.success(bean);
}
@Override
public void failure(Exception e) {
callBack.failure(e);
}
});
}
public interface ModuleCallBack {
public void success(MultiBean bean);
public void failure(Exception bean);
}
}
V(MultiView)
package com.example.adminjs.zhaokaoer;
/**
* Created by Adminjs on 2017/11/10.
*/
public interface MultiView {
public void success(MultiBean bean);
public void failure(Exception e);
}
P(MultilActivityPresenter)
package com.example.adminjs.zhaokaoer.presenter;
import com.example.adminjs.zhaokaoer.MultiBean;
import com.example.adminjs.zhaokaoer.MultiView;
import com.example.adminjs.zhaokaoer.module.MuItilActivityModule;
/**
* Created by muhanxi on 17/11/10.
*/
public class MultilActivityPresenter {
private MultiView view;
private MuItilActivityModule multilActivityModule ;
public MultilActivityPresenter(MultiView view){
this.view = view;
this.multilActivityModule = new MuItilActivityModule();
}
/**
* 下啦刷新
*/
public void onRefresh(boolean up) {
multilActivityModule.onRefresh(up, new MuItilActivityModule.ModuleCallBack() {
@Override
public void success(MultiBean bean) {
view.success(bean);
}
@Override
public void failure(Exception e) {
view.failure(e);
}
});
}
}
OKHttp页面
package com.example.adminjs.zhaokaoer.okhttp;
import com.example.adminjs.zhaokaoer.LoggingInterceptor;
import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* Created by muhanxi on 17/11/10.
*
*
* Okhttp 单例 范型的封装
*/
public class OkhttpUtils {
private static OkhttpUtils okhttpUtils = null ;
private OkhttpUtils(){
}
public static OkhttpUtils getInstance(){
if(okhttpUtils == null){
okhttpUtils = new OkhttpUtils();
client = new OkHttpClient.Builder()
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.connectTimeout(20,TimeUnit.SECONDS)
.addInterceptor(new LoggingInterceptor())
.build();
}
return okhttpUtils ;
}
private static OkHttpClient client ;
public void asy(Map<String,String> params,String url,AbstractUiCallBack callBack){
Request request = null ;
if(params != null){
FormBody.Builder builder = new FormBody.Builder() ;
for(Map.Entry<String,String> entry : params.entrySet()){
builder.add(entry.getKey(),entry.getValue());
}
FormBody body = builder.build();
request = new Request.Builder()
.url(url)
.post(body)
.build();
} else {
request = new Request.Builder()
.url(url)
.build();
}
client.newCall(request).enqueue(callBack);
}
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
public static void postFile(Map<String,String> map, String url, File file,AbstractUiCallBack callBack){
String [] array = file.getAbsolutePath().split("\\/");
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
for(Map.Entry<String,String> entry : map.entrySet()){
builder.addFormDataPart(entry.getKey(),entry.getValue());
}
builder.addFormDataPart("imageFileName",array[array.length-1]);
if(file.exists() && file.length() > 0){
builder.addFormDataPart("image",array[array.length-1], RequestBody.create(MEDIA_TYPE_PNG,file));
}
MultipartBody body = builder.build() ;
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
client.newCall(request).enqueue(callBack);
}
}
AbstractUiCallBack
package com.example.adminjs.zhaokaoer.okhttp;
import android.os.Handler;
import android.os.Looper;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/**
* Created by muhanxi on 17/11/10.
* <p>
* * Okhttp 单例 范型的封装
*/
public abstract class AbstractUiCallBack<T> implements Callback {
/**
* 成功回调
*
* @param t
*/
public abstract void success(T t);
/**
* 失败回调
*
* @param e
*/
public abstract void failure(Exception e);
private Handler handler = null;
private Class clazz;
public AbstractUiCallBack() {
handler = new Handler(Looper.getMainLooper());
// 得到的是一个 AbstractUiCallBack<T> 的Type
Type type = getClass().getGenericSuperclass();
// 得到的是T的实际Type
Type[] arr = ((ParameterizedType) type).getActualTypeArguments();
clazz = (Class) arr[0];
}
@Override
public void onFailure(Call call, IOException e) {
failure(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String result = response.body().string();
System.out.println("result = " + result);
Gson gson = new Gson();
final T t = (T) gson.fromJson(result, clazz);
handler.post(new Runnable() {
@Override
public void run() {
success(t);
}
});
} catch (IOException e) {
e.printStackTrace();
failure(e);
} catch (JsonSyntaxException e) {
e.printStackTrace();
failure(e);
}
}
}
适配器(MultilActivityAdapter)
package com.example.adminjs.zhaokaoer;
import android.content.Context;
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.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by Adminjs on 2017/11/10.
*/
public class MultilActivityAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<MultiBean.ResultBean.ListBean> list;
public MultilActivityAdapter(Context context) {
this.context = context;
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));
}
public void addData(List<MultiBean.ResultBean.ListBean> list) {
if (this.list == null) {
this.list = new ArrayList<>();
}
this.list.addAll(list);
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view1 = LayoutInflater.from(context).inflate(R.layout.item1, parent, false);
return new ViewHolder1(view1);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ViewHolder1) {
ViewHolder1 holder1 = (ViewHolder1) holder;
holder1.listItem1Textview.setText(list.get(position).getTitle());
ImageLoader.getInstance().displayImage(list.get(position).getFirstImg(), holder1.listItem1Imageview);
}
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
static class ViewHolder1 extends RecyclerView.ViewHolder {
@Bind(R.id.list_item1_imageview)
ImageView listItem1Imageview;
@Bind(R.id.list_item1_textview)
TextView listItem1Textview;
public ViewHolder1(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
拦截器LoggingInterceptor
package com.example.adminjs.zhaokaoer;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
// logger.info(String.format("Sending request %s on %s%n%s",
// request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
// logger.info(String.format("Received response for %s in %.1fms%n%s",
// response.request().url(), (t2 - t1) / 1e6d, response.headers()));
System.out.println("t2 = " + (t2-t1));
return response;
}
}