PullToRefresh的上拉加载下拉刷新功能实现(导包到项目中路径不要有中文)

* 1.Studio中PullToRefresh的导入

      github上开源:https://github.com/chrisbanes/Android-PullToRefresh
     * 使用参照博客 :http://www.cnblogs.com/qifengshi/p/5060827.html

点击File-new按钮 -> import  Module.....library库文件
* 导入的时候编译完成可能会报错,,,,,需下载buildToolsVersion "19.1.0"... 进行编译 compileSdkVersion 16
* 所以需要下载19版本的buildTools  和  16版本的sdk

关联到当前的应用...添加依赖


* 2.查看库中的代码,,,,pullToRefresh支持下列的刷新
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属性;**/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值