PullToRefreshScrollView的使用

姜运珧
2023-12-01

准备工作:
第一步:导入pullToRefresh的工程,注意需要16版本的sdk,与19版本的构建工具(需要连网下载)
第二步:将工程作为依赖库添加到自己的工程中

使用步骤:
第一步:在布局文件中添加PullToRefreshScrollView组件


<!--
    ptr:ptrDrawable="@drawable/default_ptr_flip":刷新时显示的图片
    ptr:ptrAnimationStyle="flip":刷新的图片以何种方式显示出来
    ptr:ptrHeaderBackground="#383838":刷新时头部的布局
    ptr:ptrHeaderTextColor="#FFFFFF":刷新时头部字体的颜色

    还需要添加以下的命名空间
   xmlns:ptr="http://schemas.android.com/apk/res-auto"

-->

<com.handmark.pulltorefresh.library.PullToRefreshScrollView
    android:id="@+id/refresh_scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ptr:ptrAnimationStyle="flip"
    ptr:ptrDrawable="@drawable/default_ptr_flip"
    ptr:ptrHeaderBackground="#383838"
    ptr:ptrHeaderTextColor="#FFFFFF">

<!--在scrollView中添加组件 viewPager和ListView
    注意:在scrollView中只能有一个子孩子-->

<!--在scrollView中添加可滑动组件需要重新计算高度,例如listview-->
<!--
    listview需要重写,新建一个类继承listview,重写内置方法

public class MyListview extends ListView {
    public MyListview(Context context) {
        super(context);
    }

    public MyListview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListview(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
//重新计算高度的具体方法
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

-->
<linearLayout>
<ViewPager></viewPager>
<ListView></ListView>
</linearLayout>


</com.handmark.pulltorefresh.library.PullToRefreshScrollView>

第二步:查找组件,并对PullToRefreshScrollView进行初使化

//查找组件
PullToRefreshScrollView   rsv = (PullToRefreshScrollView) findViewById(R.id.refresh_scroll_view);

//进行初使化  (1.设置模式 2.通过getLoadingLayoutProxy方法设置header与footer的刷新显示文字 3.设置监听事件)
private void intRefreshScrollView() {
    //1.设置模式
    rsv.setMode(PullToRefreshBase.Mode.BOTH);

    //2.通过调用getLoadingLayoutProxy方法,设置下拉刷新状况布局中显示的文字 ,第一个参数为true,代表下拉刷新
    ILoadingLayout headLables = rsv.getLoadingLayoutProxy(true, false);
    headLables.setPullLabel("下拉刷新");
    headLables.setRefreshingLabel("正在刷新");
    headLables.setReleaseLabel("松开刷新");

    //2.设置上拉加载底部视图中显示的文字,第一个参数为false,代表上拉加载更多
    ILoadingLayout footerLables = rsv.getLoadingLayoutProxy(false, true);
    footerLables.setPullLabel("上拉加载");
    footerLables.setRefreshingLabel("正在载入...");
    footerLables.setReleaseLabel("松开加载更多");

    //3.设置监听事件
    rsv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ScrollView>() {
        @Override
        public void onPullDownToRefresh(PullToRefreshBase<ScrollView> refreshView) {
            addToTop();//请求网络数据,并更新listview组件
            refreshComplete();//数据加载完成后,关闭header,footer
        }

        @Override
        public void onPullUpToRefresh(PullToRefreshBase<ScrollView> refreshView) {
            addToBottom()//请求网络数据,并更新listview组件
            refreshComplete();//数据加载完成后,关闭header,footer
        }
    });

}
/**
* 刷新完成时关闭
*/
public void refreshComplete(){
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            rsv.onRefreshComplete();
        }
    },1000);
}


//数据引用的方法
    public void initData(){
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr, Bean.class);
                //添加到大集合对象中
                list1.addAll(bean.getData());

                //设置适配器
                setAdapter();

            }
        });
        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex);
    }
 //下拉加载的方法:

    public void addtoTop(){
        pageIndex--;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr, Bean.class);
                //添加到大集合对象中
                list1.addAll(0,bean.getData());
                //设置适配器
                setAdapter();
            }
        });
        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex );


    }
    //上拉刷新的方法:

    public void addtoBottom(){
        pageIndex++;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr, Bean.class);
                //添加到大集合对象中
                list1.addAll(bean.getData());

                //设置适配器
                setAdapter();
            }
        });
        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex);

    }

    //设置适配器的方法:
    public void setAdapter(){
        if(adapter==null){

            adapter=new MyAdapter(MainActivity.this,list1);
            listView.setAdapter(adapter);

        }else{
            //适配器刷新
            adapter.notifyDataSetChanged();
        }

    }

///

package com.example.demo;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.Toast;

import com.example.demo.Adapter.MyAdapter;
import com.example.demo.Bean.Bean;
import com.example.demo.Util.MyTask;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshScrollView;
import com.youth.banner.Banner;

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

public class MainActivity extends AppCompatActivity {

    private Banner banner;
    private ListView listView;
    private List<Bean.DataBean> list1=new ArrayList<>();
    private List<Bean.DataScrollBean> list2=new ArrayList<>();
    private List<String> list3=new ArrayList<>();
    private PullToRefreshScrollView pull;
    private MyAdapter adapter;
    private int pageIndex=5;
    private Handler myHandler=new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载布局
        setContentView(R.layout.activity_main);
        //找控件
        banner = (Banner) findViewById(R.id.banner);
        listView = (ListView) findViewById(R.id.listview);
        pull = (PullToRefreshScrollView) findViewById(R.id.pull);
        //加载数据
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr,Bean.class);
                list2=bean.getDataScroll();
                for (int i = 0; i < list2.size(); i++) {
                    //http://www.93.gov.cn
                    list3.add("http://www.93.gov.cn"+list2.get(i).getIMAGEURL());
                }
                banner.setImageLoader(new MyImageloder());
                banner.setImages(list3);
                banner.start();
            }
        });

        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum=0");

        initData();
        initLv();
    }

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


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

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


        ILoadingLayout endLabels = pull.getLoadingLayoutProxy(false, true);
        endLabels.setPullLabel("上拉刷新");
        endLabels.setRefreshingLabel("正在载入...");
        endLabels.setReleaseLabel("放开刷新...");
        //3.设置监听事件
        pull.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ScrollView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ScrollView> refreshView) {
                addtoTop();//请求网络数据,并更新listview组件
                refreshComplete();//数据加载完成后,关闭header,footer
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ScrollView> refreshView) {
                addtoBottom();//请求网络数据,并更新listview组件
                refreshComplete();//数据加载完成后,关闭header,footer
            }
        });


    }

    //数据引用的方法
    public void initData(){
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr, Bean.class);
                //添加到大集合对象中
                list1.addAll(bean.getData());

                //设置适配器
                setAdapter();

            }
        });
        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex);
    }
    //下拉加载的方法:

    public void addtoTop(){
        pageIndex--;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr, Bean.class);
                //添加到大集合对象中
                list1.addAll(0,bean.getData());
                //设置适配器
                setAdapter();
            }
        });
        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex );


    }
    //上拉刷新的方法:

    public void addtoBottom(){
        pageIndex++;
        MyTask myTask=new MyTask(new MyTask.Icallbacks() {
            @Override
            public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Bean bean=gson.fromJson(jsonstr, Bean.class);
                //添加到大集合对象中
                list1.addAll(bean.getData());

                //设置适配器
                setAdapter();
            }
        });
        myTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex);

    }

    //设置适配器的方法:
    public void setAdapter(){
        if(adapter==null){

            adapter=new MyAdapter(MainActivity.this,list1);
            listView.setAdapter(adapter);

        }else{
            //适配器刷新
            adapter.notifyDataSetChanged();
        }

    }

    /**
     * 刷新完成时关闭
     */
    public void refreshComplete(){
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                pull.onRefreshComplete();
            }
        },1000);
    }
}
 类似资料: