在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);
根据您的要求。