在Twitter(官方應用程序)等Android應用程序中,當您遇到ListView時,能夠將其拉下(並在發佈時它會反彈)以刷新內容。 html
我想知道在您看來,實施該方法的最佳方式是什麼? java
我能想到的一些可能性: android
有什麼建議? git
PS我想知道官方Twitter應用程序源代碼什麼時候發佈。 有人提到它會被釋放,但已通過去了6個月,從那時起咱們就沒有據說過。 github
在此連接中,您能夠找到着名的PullToRefresh
視圖的分支,其中包含PullTorRefreshWebView
或PullToRefreshGridView
等新的有趣實現,或者能夠在列表的下邊緣添加PullToRefresh
。 app
https://github.com/chrisbanes/Android-PullToRefresh ide
最好的是Android 4.1中完美的工做(普通的PullToRefresh
不起做用) 佈局
請注意,在Android和WP上實現時,須要解決UX問題。 post
「對於爲何設計師/開發人員不該該在iOS應用程序風格中實現拉動刷新的一個很好的指標是Google和他們的團隊在iOS上使用它時從不使用Android上的pull-to-refresh。」 動畫
https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb
我有很是簡單的方法來作到這一點,但如今肯定它的萬無一失的方式有個人代碼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"); } }
這個對我有用 :)
沒有人提到新的「拉動刷新」類型,它顯示在操做欄的頂部,就像在Google即時或Gmail應用程序中同樣。
ActionBar-PullToRefresh庫有一個徹底相同的工做原理。
最後,Google發佈了一個正式版的pull-to-refresh庫!
它在支持庫中稱爲SwipeRefreshLayout
,文檔在這裏 :
將SwipeRefreshLayout
添加爲視圖的父級,將其視爲拉到刷新佈局。 (我以ListView
爲例,它能夠是任何View
如LinearLayout
, ScrollView
等)
<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>
爲您的班級添加一個監聽器
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);
根據您的要求。