码迷,mamicode.com
首页 > 其他好文 > 详细

上拉刷新下拉加载控件-PullToRefresh

时间:2016-05-07 07:55:10      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

  • 在很多软件中,我们会用到上拉刷新,同时大多也会有下拉加载的功能,PullToRefresh这个控件就可以帮我们实现这个效果。
    技术分享

  • 要使用这个空间首先我们要导包
    技术分享

布局文件

  • 布局文件中就是添加了一个最简单的PullToRefreshListView
<?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"
    tools:context="com.lingzhuo.testfrash.MainActivity">

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

逻辑代码

public class MainActivity extends AppCompatActivity {

    private PullToRefreshListView pullToRefreshListView;
    private List<String> dataList;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        MyAdapter adapter = new MyAdapter(dataList, getApplicationContext());
        pullToRefreshListView.setAdapter(adapter);
        /**
         * * 设置PullToRefresh刷新模式
         * BOTH:上拉刷新和下拉刷新都支持
         * DISABLED:禁用上拉下拉刷新
         * PULL_FROM_START:仅支持下拉刷新(默认)
         * PULL_FROM_END:仅支持上拉刷新
         * MANUAL_REFRESH_ONLY:只允许手动触发
         */
        pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);


        pullToRefreshListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            //在这里我通过判断滑动事件中第一个可见的item来区分当前是上拉还是下拉事件,同时设置的刷新的提示的文字内容,这样设置有一定缺陷,下面我会在详细解释,至于为什么下面的监听已经实现了上拉和下拉的区分,你自己不加这个判断多拉几次就会发现问题了
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem==0){
                    //设置刷新标签
                    pullToRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
                    //设置下拉标签
                    pullToRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
                    //设置释放标签
                    pullToRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放立即刷新");
                }else{
                    //设置刷新标签
                    pullToRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载...");
                    //设置下拉标签
                    pullToRefreshListView.getLoadingLayoutProxy().setPullLabel("加载更多...");
                    //设置释放标签
                    pullToRefreshListView.getLoadingLayoutProxy().setReleaseLabel("加载更多...");
                }
            }
        });







        // 设置刷新监听
        pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                //设置上一次刷新的提示标签
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" +new SimpleDateFormat("hh:mm:ss").format(System.currentTimeMillis()));
                for (int i = 0; i < 10; i++) {
                    dataList.add("下拉加载" + i);
                }
                pullToRefreshListView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pullToRefreshListView.onRefreshComplete();
                    }
                },1000);
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

                //设置上一次刷新的提示标签
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" +new SimpleDateFormat("hh:mm:ss").format(System.currentTimeMillis()));

                pullToRefreshListView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pullToRefreshListView.onRefreshComplete();
                    }
                },1000);
            }
        });


    }

    private void init() {
        pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
        dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            dataList.add("这是一条新数据" + i);
        }
    }
}
  • 当数据更新之后,必须调用这句代码 pullToRefreshListView.onRefreshComplete();
  • 但是我却是这么实现的
                pullToRefreshListView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pullToRefreshListView.onRefreshComplete();
                    }
                },1000);
  • 因为PullToRefreshListView 实现下拉或者上拉加载时候,可能在上拉 完成时候,调用onRefreshComplete方法去停止 刷新操作,但是,可能无效,测试产生原因,刷新获取数据时候,时间太短,就会出现该问题

  • 我们可以 延迟 1秒左右,在调用onRefreshComplete 方法,可以解决该问题

        mListView.postDelayed(new Runnable() {
            @Override
            public void run() {
                mListView.onRefreshComplete();
            }
        }, 1000);
  • 记得是在 setadpter后面执行,不然 无效
  • 其实这里我们不必太在意,以为我只是写demo,真正使用这个框架的时候,我们一般都是从网上去获取数据来加载显示,一般都会有一定的延时的。

  • 我对上拉还是下拉的判断是基于当前显示第一个item是否是列表的第一个item为基准的,这就导致,当我们第一页未填满,也就是列表第一个item显示的时候,同时我们当前列表第一项就是第一个item的时候,下拉显示的提示文字,还是和上拉显示一样的文字。

  • 这里我在网上看到有人修改源码来实现区分上拉还是下拉,可能是我太菜了,不知道咋导入第三方的library,试了半天也没成功,汗!!!如果大家有兴趣的话,可以试试这个博主的改源码的方法,如果成功了记得留言教教我,谢谢。

上拉刷新下拉加载控件-PullToRefresh

标签:

原文地址:http://blog.csdn.net/qq_28946307/article/details/51333358

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!