最近學習了幾種拉動重新整理的方式,分别是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是支援上下重新整理,而其他兩種隻有向下重新整理。