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是支持上下刷新,而其他两种只有向下刷新。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值