如何實現Android Pull-to-Refresh

在Twitter(官方應用程序)等Android應用程序中,當您遇到ListView時,能夠將其拉下(並在發佈時它會反彈)以刷新內容。 html

我想知道在您看來,實施該方法的最佳方式是什麼? java

我能想到的一些可能性: android

  1. ListView頂部的項目 - 可是我不認爲在ListView上使用動畫滾動回項目位置1(從0開始)是一項簡單的任務。
  2. ListView以外的另外一個視圖 - 但我須要注意在拉動時向下移動ListView位置,我不肯定咱們是否能夠檢測到ListView的拖動是否仍然真正滾動ListView上的項目。

有什麼建議? git

PS我想知道官方Twitter應用程序源代碼什麼時候發佈。 有人提到它會被釋放,但已通過去了6個月,從那時起咱們就沒有據說過。 github


#1樓

在此連接中,您能夠找到着名的PullToRefresh視圖的分支,其中包含PullTorRefreshWebViewPullToRefreshGridView等新的有趣實現,或者能夠在列表的下邊緣添加PullToRefreshapp

https://github.com/chrisbanes/Android-PullToRefresh ide

最好的是Android 4.1中完美的工做(普通的PullToRefresh不起做用) 佈局


#2樓

請注意,在Android和WP上實現時,須要解決UX問題。 post

「對於爲何設計師/開發人員不該該在iOS應用程序風格中實現拉動刷新的一個很好的指標是Google和他們的團隊在iOS上使用它時從不使用Android上的pull-to-refresh。」 動畫

https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb


#3樓

我有很是簡單的方法來作到這一點,但如今肯定它的萬無一失的方式有個人代碼PullDownListView.java

package com.myproject.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

/**
 * @author Pushpan
 * @date Nov 27, 2012
 **/
public class PullDownListView extends ListView implements OnScrollListener {

    private ListViewTouchEventListener mTouchListener;
    private boolean pulledDown;

    public PullDownListView(Context context) {
        super(context);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setOnScrollListener(this);
    }

    private float lastY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            lastY = ev.getRawY();
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            float newY = ev.getRawY();
            setPulledDown((newY - lastY) > 0);
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (isPulledDown()) {
                        if (mTouchListener != null) {
                            mTouchListener.onListViewPulledDown();
                            setPulledDown(false);
                        }
                    }
                }
            }, 400);
            lastY = newY;
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            lastY = 0;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        setPulledDown(false);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    public interface ListViewTouchEventListener {
        public void onListViewPulledDown();
    }

    public void setListViewTouchListener(
            ListViewTouchEventListener touchListener) {
        this.mTouchListener = touchListener;
    }

    public ListViewTouchEventListener getListViewTouchListener() {
        return mTouchListener;
    }

    public boolean isPulledDown() {
        return pulledDown;
    }

    public void setPulledDown(boolean pulledDown) {
        this.pulledDown = pulledDown;
    }
}

您只須要在您要使用此ListView的活動上實現ListViewTouchEventListener並設置監聽器

我在PullDownListViewActivity中實現了它

package com.myproject.activities;

import android.app.Activity;
import android.os.Bundle;

/**
 * @author Pushpan
 *
 */
public class PullDownListViewActivity extends Activity implements ListViewTouchEventListener {

    private PullDownListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listView = new PullDownListView(this);
        setContentView(listView);
        listView.setListViewTouchListener(this);

        //setItems in listview
    }

    public void onListViewPulledDown(){
        Log.("PullDownListViewActivity", "ListView pulled down");
    }
}

這個對我有用 :)


#4樓

沒有人提到新的「拉動刷新」類型,它顯示在操做欄的頂部,就像在Google即時或Gmail應用程序中同樣。

ActionBar-PullToRefresh庫有一個徹底相同的工做原理。


#5樓

最後,Google發佈了一個正式版的pull-to-refresh庫!

它在支持庫中稱爲SwipeRefreshLayout ,文檔在這裏

  1. SwipeRefreshLayout添加爲視圖的父級,將其視爲拉到刷新佈局。 (我以ListView爲例,它能夠是任何ViewLinearLayoutScrollView等)

    <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/pullToRefresh" android:layout_width="match_parent" android:layout_height="wrap_content"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout>
  2. 爲您的班級添加一個監聽器

    protected void onCreate(Bundle savedInstanceState) { final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh); pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { refreshData(); // your code pullToRefresh.setRefreshing(false); } }); }

你也能夠調用pullToRefresh.setRefreshing(true/false); 根據您的要求。

相關文章
相關標籤/搜索