PullToRefresh的用法

本文介绍了一个基于 PullToRefreshListView 的实现案例,包括如何设置刷新模式、自定义刷新提示文案及实现上拉加载和下拉刷新功能。此外,还展示了如何使用 Gson 解析 JSON 数据并将其展示在 ListView 中。

先导入一个library  然后在添加进去

package com.bwie.pulltofrfresh;

import android.graphics.Bitmap;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.bwie.pulltofrfresh.Utils.MyTask;
import com.bwie.pulltofrfresh.adapter.MyAdapter;
import com.bwie.pulltofrfresh.bean.User;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private Handler myHandler=new Handler();
    private PullToRefreshListView plv;
    private List<User.NewslistBean> list=new ArrayList<>();
    private List<User.NewslistBean> lists=new ArrayList<>();
    private ArrayAdapter adapter;
    private int index=1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        plv = (PullToRefreshListView) findViewById(R.id.plv);
        initdata();
        setAdapter();
        init();
    }

    public void initdata(){
        index++;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                User user = gson.fromJson(jsonstr, User.class);
                list=user.getNewslist();
                lists.addAll(list);
            }
        });
        myTask.execute("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+index);
    }

    public void addtoTop(){
        index++;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                User user = gson.fromJson(jsonstr, User.class);
                list=user.getNewslist();
                lists.addAll(0,list);
            }
        });
        myTask.execute("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+index);
    }

    public void addtoBottom(){
        index++;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                User user = gson.fromJson(jsonstr, User.class);
                list=user.getNewslist();
                lists.addAll(list);
            }
        });
        myTask.execute("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+index);
    }

    public void init() {
        //设置刷新模式 ,both代表支持上拉和下拉,pull_from_end代表上拉,pull_from_start代表下拉
        plv.setMode(PullToRefreshBase.Mode.BOTH);

/*这里通过getLoadingLayoutProxy 方法来指定上拉和下拉时显示的状态的区别,第一个true 代表下来状态 ,第二个true 代表上拉的状态
如果想区分上拉和下拉状态的不同,可以分别设置*/

        ILoadingLayout startLabels = plv.getLoadingLayoutProxy(true, false);
        startLabels.setPullLabel("下拉刷新");
        startLabels.setRefreshingLabel("正在拉");
        startLabels.setReleaseLabel("放开刷新");

        ILoadingLayout endLabels = plv.getLoadingLayoutProxy(false, true);
        endLabels.setPullLabel("上拉刷新");
        endLabels.setRefreshingLabel("正在载入...");
        endLabels.setReleaseLabel("放开刷新...");


/*如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。
  如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。
  当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法,Mode.PULL_FROM_END的时候只调用onPullUpToRefresh()方法.

  加载数据完成后 必须 调用下 onRefreshComplete() 完成关闭 header,footer视图
*/
        plv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {//下拉刷新的回调
                //下拉刷新的数据,显示在listview列表的最上面
                addtoTop();
                myHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //刷新完成,必须在异步下完成
                        plv.onRefreshComplete();
                        //刷新适配器
                        setAdapter();

                    }
                }, 1000);
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {//上拉加载的回调
                //加载更多的数据,添加到集合列表的最后面
                addtoBottom();
                myHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //刷新完成,必须在异步下完成
                        plv.onRefreshComplete();
                        //刷新适配器
                        setAdapter();
                    }
                }, 1000);
            }
        });
    }

    public void setAdapter() {
        if (adapter == null) {
            MyAdapter adapter = new MyAdapter(lists,MainActivity.this);
            plv.setAdapter(adapter);
        } else {
            adapter.notifyDataSetChanged();
        }
    }
}

布局
<?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="com.bwie.pulltofrfresh.MainActivity">

    <com.handmark.pulltorefresh.library.PullToRefreshListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/plv"
        />

</RelativeLayout>


适配器

package com.bwie.pulltofrfresh.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bwie.pulltofrfresh.MainActivity;
import com.bwie.pulltofrfresh.R;
import com.bwie.pulltofrfresh.bean.User;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.List;

/**
 * Created by 老北城 on 2017/10/19.
 */

public class MyAdapter extends BaseAdapter {
    private List<User.NewslistBean> lists;
    private Context context;

    public MyAdapter(List<User.NewslistBean> lists, Context context) {
        this.lists = lists;
        this.context = context;
    }

    @Override
    public int getCount() {
        return lists.size();
    }

    @Override
    public Object getItem(int position) {
        return lists.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView==null){
            convertView=View.inflate(context, R.layout.item,null);
            holder=new ViewHolder();
            holder.img= (ImageView) convertView.findViewById(R.id.img);
            holder.text= (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        }else{
            holder= (ViewHolder) convertView.getTag();
        }
        Log.i("zzz",lists.toString());
        holder.text.setText(lists.get(position).getTitle());
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)//进行内存缓存
                .cacheOnDisk(true)//进行sd卡缓存
                .showImageOnLoading(R.drawable.ic_stub) // 设置正在下载中的图片
                .showImageForEmptyUri(R.drawable.ic_empty) //没有请求地址时
                .showImageOnFail(R.drawable.ic_error)//下载错误时
                .bitmapConfig(Bitmap.Config.RGB_565)//设置图片质量
                .build();
        //第三步:进行加载显示
        ImageLoader.getInstance().displayImage(lists.get(position).getPicUrl(), holder.img, options);
        return convertView;
    }
}
class ViewHolder{
    ImageView img;
    TextView text;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值