* 1.Studio中PullToRefresh的导入
github上开源:https://github.com/chrisbanes/Android-PullToRefresh
* 使用参照博客 :http://www.cnblogs.com/qifengshi/p/5060827.html
* 导入的时候编译完成可能会报错,,,,,需下载buildToolsVersion "19.1.0"... 进行编译 compileSdkVersion 16
* 所以需要下载19版本的buildTools 和 16版本的sdk
关联到当前的应用...添加依赖
PullToRefreshExpandableListView可刷新的二级列表
PullToRefreshGridView可以刷新的GridView
PullToRefreshListView支持listVIEW的刷新
PullToRefreshWebView可以刷新的WebView
PullToRefreshScrollView可以刷新的scrollView
* XlistView只支持listView的刷新
* 3.使用
布局中没有提示,就复制布局的包名,全类名应用,....
* 1.refreshListView.setMode(PullToRefreshBase.Mode.BOTH); 设置上拉加载下拉刷新都支持的模式
* 2.startLabels = refreshListView.getLoadingLayoutProxy(true, false);
endLabels = refreshListView.getLoadingLayoutProxy(false, true);
* 设置上拉和下拉刷新的时候,显示状态的文字
* 3.refreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>()设置监听事件
* 4.refreshView.onRefreshComplete();加载数据完成后停止刷新,,,只能异步调用
* 5. startLabels.setLastUpdatedLabel("上次刷新:2017-09-14");设置上次刷新的时间
endLabels.setLastUpdatedLabel("上次加载时间:09-15");
下面是功能的代码实现方式:
一. MainActivity.java
package com.PullTorefresh; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import com.google.gson.Gson; import com.handmark.pulltorefresh.library.ILoadingLayout; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import adapter.MyAdapter; import bean.PageBean; public class MainActivity extends AppCompatActivity { //记录当前页面所有的数据....上拉或下拉添加到集合 private List<PageBean.NewslistBean> list = new ArrayList<>(); private PullToRefreshListView refreshListView; private int page_num = 1; //下拉刷新的页数 private ILoadingLayout startLabels; private ILoadingLayout endLabels; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); refreshListView = (PullToRefreshListView) findViewById(R.id.refresh_list_view); //异步加载网络数据的方法 getDataFromNet(); //1.设置刷新的模式(PullToRefreshBase.Mode.BOTH:上下都可以刷新加载) refreshListView.setMode(PullToRefreshBase.Mode.BOTH); //2.设置刷新显示的文字 startLabels = refreshListView.getLoadingLayoutProxy(true, false); startLabels.setPullLabel("下拉刷新"); startLabels.setRefreshingLabel("正在刷新..."); startLabels.setReleaseLabel("放开刷新"); endLabels = refreshListView.getLoadingLayoutProxy(false, true); endLabels.setPullLabel("上拉刷新"); endLabels.setRefreshingLabel("正在载入..."); endLabels.setReleaseLabel("放开刷新..."); //3.设置监听事件 refreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { //下拉刷新 @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { page_num++; //再次请求数据 getRefreshData(); } //上拉加载...不停的请求数据新的数据或者page=1的数据 @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { //获取重复数据 // getDataFromNet(); //获取新的数据 getRefreshData(); } }); } /** * 下拉刷新获取数据 * 1.page_num 改变 * 2.每次添加到集合的前边 */ private void getRefreshData() { //1.创建异步任务的对象..第一个参数url路径Void,第二个参数表示进度Void,第三个参数返回值类型String(可以为空) AsyncTask<Void,Void,String> task = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { try { String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+page_num; //连接网络 URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); //响应数据 int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = streamToString(inputStream,"utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return ""; } @Override protected void onPostExecute(String result) { //解析数据 PageBean pageBean = new Gson().fromJson(result, PageBean.class); //把解析的数据添加到集合前面,设置适配器 list.addAll(0,pageBean.getNewslist()); setAdapter(); //停止刷新 refreshListView.onRefreshComplete(); //设置本次刷新的时间 Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); startLabels.setLastUpdatedLabel("上次刷新的时间为:"+dateFormat.format(date)); } }; task.execute(); } /** * 获取网络数据 */ public void getDataFromNet() { //1.创建异步任务的对象..第一个参数url路径Void,第二个参数表示进度Void,第三个参数返回值类型String(可以为空) AsyncTask<Void,Void,String> task = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { try { String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page=1"; //连接网络 URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); //响应数据 int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = streamToString(inputStream,"utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return ""; } @Override protected void onPostExecute(String result) { //解析数据 PageBean pageBean = new Gson().fromJson(result, PageBean.class); //把解析的数据添加到集合中,设置适配器 list.addAll(pageBean.getNewslist()); setAdapter(); //停止刷新 refreshListView.onRefreshComplete(); } }; task.execute(); } //设置适配器的方法 public void setAdapter(){ if (adapter == null){ adapter = new MyAdapter(MainActivity.this, list); refreshListView.setAdapter(adapter); }else { adapter.notifyDataSetChanged(); } } //解析数据的方法 private String streamToString(InputStream inputStream,String charset) { try { //转换流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset); //缓冲流 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //读取数据 String s = null; StringBuilder builder = new StringBuilder(); while ((s = bufferedReader.readLine()) != null){ builder.append(s); } //关流,返回数据 bufferedReader.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } }
二. 自定义适配器类
package adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.PullTorefresh.R; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; import bean.PageBean; import util.ImageLoaderUtil; public class MyAdapter extends BaseAdapter{ private Context context; private List<PageBean.NewslistBean> list; public MyAdapter(Context context, List<PageBean.NewslistBean> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder = null; if (view == null){ view = View.inflate(context, R.layout.item_layout,null); holder = new ViewHolder(); //查找控件 holder.text = view.findViewById(R.id.text); holder.image = view.findViewById(R.id.image); //绑定数据 view.setTag(holder); }else { holder = (ViewHolder) view.getTag(); } //获取数据重新赋值 holder.text.setText(list.get(i).getTitle()); ImageLoader.getInstance().displayImage(list.get(i).getPicUrl(),holder.image, ImageLoaderUtil.getDefaultOption()); return view; } static class ViewHolder{ TextView text; ImageView image; } }
三. 自定义封装的实体Bean类(导入Gson包)
四. 全局初始化imageloader类的工具类(导入加载ImageLoader类的包):
1. BaseApplication.java
package util; import android.app.Application; /** * 全局初始化的BaseApplication类 */ public class BaseApplication extends Application{ @Override public void onCreate() { super.onCreate(); //配置ImageLoader类 ImageLoaderUtil.init(this); } }
2. ImageLoaderUtil.java
package util; import android.content.Context; import android.graphics.Bitmap; import com.PullTorefresh.R; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator; import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.decode.BaseImageDecoder; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import com.nostra13.universalimageloader.utils.StorageUtils; import java.io.File; //配置imageloader类的工具类 public class ImageLoaderUtil { public static void init(Context context) { //1.获取配置config对象 File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .threadPoolSize(3) // default 线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级 .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值 .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiscCache(cacheDir)) // default 可以自定义缓存路径 .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值 .diskCacheFileCount(100) // 可以缓存的文件数量 // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密 .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder(true)) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() // 打印debug log .build(); //开始构建 //2.初始化配置...ImageLoader.getInstance()图片加载器的对象,单例模式 ImageLoader.getInstance().init(config); } /** * imageLoader加载图片的默认选项 * @return */ public static DisplayImageOptions getDefaultOption(){ DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片 .resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位 .delayBeforeLoading(1000) // 下载前的延迟时间 .cacheInMemory(true) // default 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型 .displayer(new SimpleBitmapDisplayer()) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20) .build(); return options; } /** * imageLoader加载圆角图片....指定圆角的大小 * @return */ public static DisplayImageOptions getRoundedOption(int corner){ DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片 .resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位 .delayBeforeLoading(1000) // 下载前的延迟时间 .cacheInMemory(true) // default 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型 .displayer(new RoundedBitmapDisplayer(corner)) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20) .build(); return options; } /** * imageLoader加载圆形图片 * @return */ public static DisplayImageOptions getCircleOption(){ DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片 .resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位 .delayBeforeLoading(1000) // 下载前的延迟时间 .cacheInMemory(true) // default 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型 //.displayer(new CircleBitmapDisplayer()) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20) .build(); return options; } }
五. 自定义的布局:
1. activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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"> <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto" android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/refresh_list_view" ptr:ptrDrawable="@drawable/default_ptr_flip" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="#383838" ptr:ptrHeaderTextColor="#FFFFFF" > </com.handmark.pulltorefresh.library.PullToRefreshListView> </RelativeLayout>
2. item_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="10dp" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="118dp" android:layout_height="118dp" android:layout_gravity="center_vertical" /> <TextView android:id="@+id/text" android:textSize="16sp" android:layout_marginLeft="6dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </LinearLayout>
六.最后在AndroidManifest.xml中加入权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"></uses-permission>
/** 声明Imageloader类的name属性;**/