如何实现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); 根据您的要求。

相关文章
相关标签/搜索