最近学习了几种拉动刷新的方式,分别是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: 这属于第三方库,所以需要导包。
把它下载下来之后解压打开注意其中的 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>
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);
}
}
还有认识一种刷新的样式,个人认为挺好看的,直接把下面这句添加到gradler的依赖中也是可以的。这个就不写出来了。
compile 'org.ptrheader.library:ultra-ptr-headers:0.3.0'
总的来说这三种拉动刷新的方式都是有很多很多共同点的,使用起来也很简单,需要注意的几点:
1.如果你在onRefrash()方法中执行refreashConplete()方法如果没效果的话就应该考虑开个子线程等待一下下再去调用。
2.UltraPtr是要setHeaderView()来添加刷新的样式,同时addPtrUIHander()来将添加的样式与刷新的状态保持一致。
3.PullToRefreash是支持上下刷新,而其他两种只有向下刷新。