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

来源:互联网 发布:网络兼职打字录入员 编辑:程序博客网 时间:2024/06/10 06:01

最近学习了几种拉动刷新的方式,分别是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 24buildToolsVersion "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是支持上下刷新,而其他两种只有向下刷新。



0 0