一个强大的拉动刷新开源项目,支持各种控件下拉刷新,ListView、ExpandableListView、GridView、WebView、ScrollView、Horizontal ScrollView、ViewPager、Fragment上下左右拉动刷新。
android-pulltorefresh源码里提供了samples,里面分别演示了上面说到的几个页面。
1、PullToRefreshListView
示例PullToRefreshListActivity使用了PullToRefreshListView,它的页面结构很简单,提供了一个自定义控件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- The PullToRefreshListView replaces a standard ListView widget. --> <com.handmark.pulltorefresh.library.PullToRefreshListView android:id="@+id/pull_refresh_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="#00000000" android:divider="#19000000" android:dividerHeight="4dp" android:fadingEdge="none" android:fastScrollEnabled="false" android:footerDividersEnabled="false" android:headerDividersEnabled="false" android:smoothScrollbar="true" /> </LinearLayout>
OnCreate方法:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 构造ListView控件,调用基类的init方法。 setContentView(R.layout.activity_ptr_list); mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list); // 设置一个监听对象,在下拉刷新时设置相应的文字和执行对应的任务 mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // 更新顶部或者底部的刷新标签 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); // 执行刷新时的后台任务 new GetDataTask().execute(); } }); // 设置一个底部监听对象,当LiveView最后一个Item显示时触发 mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() { @Override public void onLastItemVisible() { Toast.makeText(PullToRefreshListActivity.this, "End of List!", Toast.LENGTH_SHORT).show(); } }); // 取得真实的View ListView actualListView = mPullRefreshListView.getRefreshableView(); // 注册为上下文菜单使用的View,即上下文菜单使用的view是真实的View registerForContextMenu(actualListView); mListItems = new LinkedList<String>(); mListItems.addAll(Arrays.asList(mStrings)); mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems); // 创建一个声音监听器,当触发某事件时播放对应的音乐 SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(this); soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event); soundListener.addSoundEvent(State.RESET, R.raw.reset_sound); soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound); mPullRefreshListView.setOnPullEventListener(soundListener); // 真实的View控件设置数据适配对象,也可以用 mPullRefreshListView.setAdapter(mAdapter) actualListView.setAdapter(mAdapter); }
后台任务:
// 取得数据任务 private class GetDataTask extends AsyncTask<Void, Void, String[]> { @Override protected String[] doInBackground(Void... params) { try { // 模拟后台任务 Thread.sleep(2000); } catch (InterruptedException e) { } return mStrings; } @Override protected void onPostExecute(String[] result) { mListItems.addFirst("Added after refresh..."); mAdapter.notifyDataSetChanged(); // 当任务执行完毕必须调用onRefreshComplete() mPullRefreshListView.onRefreshComplete(); super.onPostExecute(result); } }
通过以上的代码的注释,如何使用PullToRefreshListView大概有的简要的了解,归纳如下:
1、创建PullToRefreshListView实例
2、设置OnRefreshListener对象
3、在onRefresh刷新后,调用onRefreshComplete,来完成刷新。
下一章对关键步骤分析一下处理流程。