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


    一个强大的拉动刷新开源项目,支持各种控件下拉刷新,ListView、ExpandableListView、GridView、WebView、ScrollView、Horizontal ScrollView、ViewPager、Fragment上下左右拉动刷新。

    image

    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,来完成刷新。

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

  • 相关阅读:
    POJ3783Balls[DP 最坏情况最优解]
    openjudge2989糖果[DP 01背包可行性]
    POJ1160 Post Office[序列DP]
    石子合并[DP-N3]
    POJ1065Wooden Sticks[DP LIS]
    POJ3636Nested Dolls[DP LIS]
    LCIS(最长公共上升子序列)Vijos1264神秘的咒语
    Vijos1680距离/openjudge2988计算字符串的距离[DP]
    Vijos1392拼拼图的小衫[背包DP|二维信息DP]
    NOIP2000方格取数[DP]
  • 原文地址:https://www.cnblogs.com/seven1979/p/4364935.html
Copyright © 2020-2023  润新知