Recyclerview布局+spring上拉、下拉
来源:互联网 发布:git clone ssh 端口 编辑:程序博客网 时间:2024/06/14 14:28
依赖包
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; } }
阅读全文
0 0
- Recyclerview布局+spring上拉、下拉
- recyclerview,okHttp,布局切换,springView上拉刷新下拉加载
- Recyclerview支持下拉刷新、上拉加载,包括线性布局、网格布局和 流布局
- 上拉,下拉的布局
- 上拉,下拉布局2
- 上拉,下拉,布局3
- 上拉,下拉布局4
- RecyclerView使用详解一代替ListView(点击事件,添加头布局,上拉刷新下拉加载)
- RecyclerView三种布局下的上拉加载 下拉刷新
- RecyclerView下拉刷新、上拉加载更多以及复杂列表布局的实现
- 基于Recyclerview实现复杂布局+SwipeRefreshLayout实现下拉刷新和上拉加载
- 新WaveSwipeRefreshLayout+RecyclerView上拉加载下拉刷新+多条目布局
- RecyclerView上拉隐藏Toolbar,下拉显示
- RecyclerView实现上拉加载,下拉刷新
- RecyclerView 下拉刷新上拉加载更多
- RecyclerView实现上拉加载,下拉刷新
- RecyclerView 下拉刷新上拉加载更多
- RecyclerView的上拉加载,下拉刷新
- JavaScript获取HTML元素的四种方法
- 毕业一年的菜鸟某东面试总结
- 数据库的隔离级别、事务的特性、范式
- UVA1589
- Android 源码解析之WindowManager更新窗口
- Recyclerview布局+spring上拉、下拉
- 新的开始
- jQuery判断用户名并实现省市的二级联动
- 使用jQuery动态创建一个表格,根据用户数输入的内容添加一行数据
- 面向对象编程初步
- 020 第五讲 特征值及特征向量
- 在C++中深拷贝和浅拷贝的基本用法
- 利用栈解决括号匹配和逆波兰表达式
- [简单逻辑学]逻辑学的基本原理——从特称到全称