天天看點

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是支援上下重新整理,而其他兩種隻有向下重新整理。