天天看点

Android中三种简便的拉动刷新方式

最近学习了几种拉动刷新的方式,分别是SwipeRefreshLayout,PullToRefresh,UtraPtr三种。下面来看下这几种的使用方式。

SwiperefreshLayout:(google提供的,在v4包下)

Xml文件:

<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"
    tools:context="com.example.administrator.swiperefreshlayout.MainActivity">
    <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:id="@+id/swiperefreshlayout"
        android:layout_height="match_parent">
        <ListView
            android:layout_width="match_parent"
            android:id="@+id/listview"
            android:layout_height="match_parent"></ListView>
    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
           

Activity:

package com.example.administrator.swiperefreshlayout;

import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

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

public class MainActivity extends AppCompatActivity {

    private ListView listview;
    private SwipeRefreshLayout swiperefresh;
    private List<String> list;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview = ((ListView) findViewById(R.id.listview));
        swiperefresh = ((SwipeRefreshLayout) findViewById(R.id.swiperefreshlayout));
        initDatas();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);
        listview.setAdapter(adapter);
        swiperefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                list.add(0,"addBigname");
                adapter.notifyDataSetChanged();
                swiperefresh.setRefreshing(false);
            }
        });
    }

    private void initDatas() {
        list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            list.add("bigname" + i);
        }
    }
}
           

这个的用法是超简单的。只需要吧刷新的逻辑在onReFresh()方法中实现就可以了,只支持下拉的刷新。

PullToRefreash: 这属于第三方库,所以需要导包。 (下载地址: https://github.com/chrisbanes/ Android -PullToRefresh ) 把它下载下来之后解压打开注意其中的 library 文件夹,我们需要的就是这个库。 这里顺便把导包的步骤写一下,因为自己对导包这一块也是一直感觉怕怕的, 导包步骤: ①new->import module->找到刚刚说的library->finish ②检查你自己的gradle文件与library包中的gradle文件中的compileSdkVersion,以及buildToolsVersion,

compileSdkVersion 24
buildToolsVersion "24.0.2"
      

把两者改为一致的即可。 ③如果提示下面这句代码中的floor爆红的话,那就把FloatMath改为Math。

float exactContentHeight = FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale());      
④最后别忘了将app依赖该library。      

那导包的工作就到这完成啦!接下来看代码

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"
    tools:context="com.example.administrator.pulltorefresh12.MainActivity">

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

留意:这里直接就是一个控件

Activity:

package com.example.administrator.pulltorefresh12;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;

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

public class MainActivity extends AppCompatActivity {

    private PullToRefreshListView refresh_listview;
    private List<String> list;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        refresh_listview = ((PullToRefreshListView) findViewById(R.id.refresh_listview));
        initDatas();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);
        refresh_listview.setAdapter(adapter);
        refresh_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            //下拉时回调
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                list.add(0, "下拉数据");
                adapter.notifyDataSetChanged();
                startThread();
            }
            //上拉时回调
            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
                list.add(0, "上拉数据");
                adapter.notifyDataSetChanged();
                refresh_listview.setRefreshing(false);
                startThread();
            }
        });
    }

    private void startThread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            refresh_listview.onRefreshComplete();//停止刷新动画
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void initDatas() {
        list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            list.add("bigname" + i);
        }
    }
}
           

注意一个问题:上拉下拉中是不能够马上执行停止刷新动画的,这样做的刷新效果一直在那,不会收上去,所以我像上面这样等待了一会再去收回刷新画面。

这个是支持上拉和下拉刷新的。 当然刷新显示的字体什么的是可以自定义的,需要的自己查阅一下吧。   UltraPtr: 最后一刷新方式了,同样是第三方库的。所以继续还是导包导包导包。 下载地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh liaohuqiu,大神写出来的,好生羡慕^_^。 下载好解压之后留意其中的ptr-demo,ptr-lib两个文件夹,demo是大神给我们的案例,想看的可以去看下大神们是怎么说的,而lib是我们需要导入的库了。 按照上面说的方式导好包就ok了,过程中会报错,解决的办法还是那样,对应的gradle要一致。

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"
    tools:context="com.example.administrator.ultraptr20.MainActivity">

    <in.srain.cube.views.ptr.PtrFrameLayout
        android:id="@+id/ptrframelayout"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
        <ListView
            android:layout_width="match_parent"
            android:id="@+id/listview"
            android:layout_height="match_parent"></ListView>
    </in.srain.cube.views.ptr.PtrFrameLayout>
</RelativeLayout>
           

Activity:

package com.example.administrator.ultraptr20;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

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

import in.srain.cube.views.ptr.PtrClassicDefaultHeader;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.header.MaterialHeader;
import in.srain.cube.views.ptr.header.StoreHouseHeader;

public class MainActivity extends AppCompatActivity {

    private PtrFrameLayout ptr;
    private ListView listview;
    private List<String> list;
    private ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ptr = ((PtrFrameLayout) findViewById(R.id.ptrframelayout));
        listview = ((ListView) findViewById(R.id.listview));
        initDatas();
        listview.setAdapter(adapter);
        //有几种刷新的样式,
//        setPtrClassicDefaultHeader();//经典的样式
//        setStoreHouseHeader();//文字闪烁样式
        setMaterialHeader();//MD样式
        ptr.setPtrHandler(new PtrDefaultHandler() {
            @Override
            public void onRefreshBegin(PtrFrameLayout frame) {
                list.add(0, "上拉数据");
                adapter.notifyDataSetChanged();
                ptr.refreshComplete();
            }
        });
    }

    private void initDatas() {
        list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            list.add("bigname" + i);
        }
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
    }

    private void setPtrClassicDefaultHeader() {
        PtrClassicDefaultHeader header = new PtrClassicDefaultHeader(this);
        ptr.setHeaderView(header);
        ptr.addPtrUIHandler(header);//让头布局的状态和下拉刷新状态保持一致
    }

    private void setMaterialHeader() {
        MaterialHeader header = new MaterialHeader(this);
        ptr.setHeaderView(header);
        ptr.addPtrUIHandler(header);
    }

    private void setStoreHouseHeader() {
        StoreHouseHeader header = new StoreHouseHeader(this);
        header.initWithString("loading...");//不支持中文
        ptr.setHeaderView(header);
        ptr.addPtrUIHandler(header);
    }
}
           

奇怪的是这里并不需要等待就能够的停止刷新,(PullToRefresh需要等待一会才能够刷新),与其说这里奇怪不如说上面要等待的那个才是一个bugger才对。 还有认识一种刷新的样式,个人认为挺好看的,直接把下面这句添加到gradler的依赖中也是可以的。这个就不写出来了。 compile 'org.ptrheader.library:ultra-ptr-headers:0.3.0'

总的来说这三种拉动刷新的方式都是有很多很多共同点的,使用起来也很简单,需要注意的几点: 1.如果你在onRefrash()方法中执行refreashConplete()方法如果没效果的话就应该考虑开个子线程等待一下下再去调用。 2.UltraPtr是要setHeaderView()来添加刷新的样式,同时addPtrUIHander()来将添加的样式与刷新的状态保持一致。 3.PullToRefreash是支持上下刷新,而其他两种只有向下刷新。