PullToRefresh实现下拉刷新上拉加载

最近学习了一款上拉刷新下拉加载的第三方库,挺好用的,顺便也学习下写博客,写的不好还请勿喷!

PullToRefresh第三方库的下载地址:(https://github.com/chrisbanes/Android-PullToRefresh)

下载好后作为一个library导入到studio的项目中,导入的时候可能会报错,自己解决下gradle的版本问题

首先布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="android.shuaxin.MainActivity">

    <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="2dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true" />
</RelativeLayout>

然后在代码中进行实例化和配置



public final class MainActivity extends ListActivity {



    private LinkedList<String> mListItems;
    private PullToRefreshListView mPullRefreshListView;
    private ArrayAdapter<String> mAdapter;
    private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
            "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
            "Allgauer Emmentaler" };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);

        // Set a listener to be invoked when the list should be refreshed.
        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);

                // Update the LastUpdatedLabel
                //设置更新时间
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);

                // Do work to refresh the list here.
                new GetDataTask().execute();
            }
        });

        //设置监听最后一条
        mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {

            @Override
            public void onLastItemVisible() {
                Toast.makeText(MainActivity.this, "滑动到最后一条了!", Toast.LENGTH_SHORT).show();
            }
        });

        //得到ListView
        ListView actualListView = mPullRefreshListView.getRefreshableView();

        mListItems = new LinkedList<String>();
        mListItems.addAll(Arrays.asList(mStrings));

        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);

        /**
         * Add Sound Event Listener
         * 添加刷新事件并且发出声音
         */
        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);

        // You can also just use setListAdapter(mAdapter) or
        // mPullRefreshListView.setAdapter(mAdapter)
        actualListView.setAdapter(mAdapter);
            mPullRefreshListView.setMode(Mode.BOTH);//设置可以同时上拉刷新和下拉加载
        //此处更改后onPostExecute方法也需要更改下内容,删除if条件语句
//            mPullRefreshListView.setMode(Mode.PULL_FROM_START);//设置只可以下拉
//            mPullRefreshListView.setMode(Mode.PULL_FROM_END);//设置只可以上拉

    }


    private class GetDataTask extends AsyncTask<Void, Void, String[]> {

        @Override
        protected String[] doInBackground(Void... params) {
            // 异步加载线程休眠1.5            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
            }
            return mStrings;
        }

        @Override
        protected void onPostExecute(String[] result) {
            if (mPullRefreshListView.isHeaderShown()){
                mListItems.addFirst("下拉刷新到新数据");
            }else if (mPullRefreshListView.isFooterShown()){
                mListItems.addLast("上拉加载到新数据");
            }

            mAdapter.notifyDataSetChanged();
            // Call onRefreshComplete when the list has been refreshed.
            mPullRefreshListView.onRefreshComplete();

            super.onPostExecute(result);
        }
    }





}


在onPostExecute方法中的isHeaderShown()和isFooterShown()是自己在库中添加的接口,在library\src\main\java\com\handmark\pulltorefresh\library\PullToRefreshAdapterViewBase类下添加两个接口用来判区分是上拉还是下拉:

public boolean isHeaderShown() {
   return getHeaderLayout().isShown();
}

public boolean isFooterShown() {
   return getFooterLayout().isShown();
}
此时运行程序已经可以达到上拉加载下拉刷新的效果了,但是无论是上拉还是下拉所弹出的刷新界面此时都是下拉刷新字样,那么如何更改呢?



在library\src\main\java\com\handmark\pulltorefresh\library\internal\LoadingLayout类下更改mPullLabel的值,我的是在在第95行,将值改为上拉刷新即可



到此为止大功告成!



项目地址:http://download.csdn.net/detail/zhangzibin1992/9756718

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值