android-pulltorefresh源码解析(1)--PullToRefreshListView的使用

一个强大的拉动刷新开源项目,支持各种控件下拉刷新,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,来完成刷新。

下一章对关键步骤分析一下处理流程。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。