下拉刷新与上拉更多(用SwipeRefreshLayout和ListView实现)

SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便。

1:在布局中添加SwipeRefreshLayout和Listview组件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    style="@style/BaseStyle.White"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <!--下拉刷新-->
    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srl_refresh"
        style="@style/BaseStyle">

        <!--上拉更多-->
        <ListView
            android:id="@+id/lv_person_goods"
            style="@style/BaseStyle"
            android:gravity="center"
            android:horizontalSpacing="@dimen/margin_standard"
            android:numColumns="2"
            android:scrollbarStyle="outsideOverlay"
            android:verticalSpacing="@dimen/margin_standard"/>
    </android.support.v4.widget.SwipeRefreshLayout>

    <!--数据为空时显示的View-->
    <TextView
        android:id="@+id/tv_no_data"
        style="@style/BaseStyle.FullWrap"
        android:layout_marginTop="@dimen/textview_width_small"
        android:gravity="center_horizontal"
        android:text="暂无数据"
        android:textColor="@color/text_title_standard"
        android:textSize="@dimen/font_size_small"
        android:visibility="gone"/>

</RelativeLayout>

2:在主页面使用

/**
 * Created by pengkv on 2014/12/5.
 * 我的宝贝列表页面,用于选择添加到拍卖场
 */
public class MySaleGoodsListViewActivity extends VolleyActivity implements IInit, IResponseHandler, IPagination, SwipeRefreshLayout.OnRefreshListener {

    private int auctionID;
    private GoodsInfoViewModel mViewModel;
    private TextView mEmptyTV;//空白视图
    private ListView mListView;//专场列表
    private PersonGoodsListAdapter mAdapter;//适配器
    private SwipeRefreshLayout mSwipeRefreshLayout;//下拉刷新布局

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_me_auction_goods_list);

        init();
    }

    @Override
    public void init() {
        ActionBarUtil.setup(this, "我店铺的宝贝");

        auctionID = getIntent().getIntExtra(EnumIntentKey.AUCTION_ID.toString(), 0);

        mListView = (ListView) findViewById(R.id.lv_person_goods);
        mEmptyTV = (TextView) findViewById(R.id.tv_no_data);

        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_refresh);//下拉刷新组件
        mSwipeRefreshLayout.setOnRefreshListener(this);//设置刷新监听器
        mSwipeRefreshLayout.setColorSchemeResources(R.color.background_blue_standard, R.color.white, R.color.background_blue_standard, R.color.white);//设置下拉刷新组件的颜色

        mViewModel = new GoodsInfoViewModel();
        fetchData(FIRST);//得到喜欢列表数据
    }

    @Override
    public void fetchData(int tag) {
        GetGoodsListForSellParam param = new GetGoodsListForSellParam(Data.getUserID(), 1, mViewModel.getPageIndex(), Data.PAGE_SIZE_MEDIUM);
        SquareApi.getGoodsListForSell(this, param, tag);
    }

    /**
     * 更新适配器
     */
    @Override
    protected void onRestart() {
        super.onRestart();
        mViewModel.reset();
        fetchData(FIRST);//得到喜欢列表数据
    }

    @Override
    public void updateUI(Object response, final int tag) {
        if (response == null) return;

        if (tag == FIRST) {
            //得到喜欢列表数据
            mViewModel.inflate(response);

            //通过判断喜欢列表适配器mAdapter是否为空来做分页处理
            if (mAdapter == null) {
                //当适配器为空
                mSwipeRefreshLayout.setRefreshing(false);//下拉刷新组件停止刷新

                mAdapter = new PersonGoodsListAdapter(this, mViewModel.getList());
                mListView.setAdapter(mAdapter);//ListView绑定喜欢适配器

                /**
                 *  上拉更多
                 */
                mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(AbsListView view, int scrollState) {
                        switch (scrollState) {
                            case SCROLL_STATE_IDLE:

                                if (mListView.getLastVisiblePosition() == mViewModel.getList().size() - 1) {
                                    if (!mViewModel.isComplete()) {
                                        fetchNewData(FIRST);
                                    }
                                }
                                break;
                        }
                    }

                    @Override
                    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    }
                });

                mListView.setEmptyView(mEmptyTV);//将此图片绑定到喜欢列表ListView

            } else {
                mAdapter.notifyDataSetChanged();//适配器更新数据
            }

            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent i = new Intent();
                    if (getIntent().getBooleanExtra(EnumIntentKey.IS_SELECT_LINK.toString(), false)) { // 选择发送链接
                        i.putExtra(EnumIntentKey.GOODS_ID.toString(), mViewModel.getList().get(position).getGoodsID());
                        i.putExtra(EnumIntentKey.GOODS_NAME.toString(), mViewModel.getList().get(position).getGoodsName());
                        setResult(RESULT_OK, i);
                    } else {  // 添加到专场
                        i.setClass(MySaleGoodsListViewActivity.this, AddAuctionGoodsActivity.class);
                        i.putExtra(EnumIntentKey.AUCTION_GOODS_ID.toString(), mViewModel.getList().get(position).getGoodsID());
                        i.putExtra(EnumIntentKey.IS_DO.toString(), true);
                        i.putExtra(EnumIntentKey.AUCTION_ID.toString(), auctionID);
                        startActivity(i);
                    }
                    finish();
                }
            });
        }
    }

    @Override
    public void fetchNewData(int tag) {
        mViewModel.increasePageIndex();
        fetchData(FIRST);//得到喜欢的拍品列表数据
    }

    @Override
    public void onRefresh() {
        mViewModel.reset();//重置页索引和完成状态
        mAdapter = null;//清空适配器
        fetchData(FIRST);//得到喜欢的拍品列表数据
    }
}

解析:

(下拉刷新)主页面需要实现SwipeRefreshLayout.OnRefreshListener接口,然后在

 @Override
    public void onRefresh() {
    }

方法中实现更新

(上拉更多)上拉更多需要监听setOnScrollListener()方法

  mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(AbsListView view, int scrollState) {
                        switch (scrollState) {
                            case SCROLL_STATE_IDLE:

                                if (mListView.getLastVisiblePosition() == mViewModel.getList().size() - 1) {
                                    if (!mViewModel.isComplete()) {
                                        fetchNewData(FIRST);
                                    }
                                }
                                break;
                        }
                    }

                    @Override
                    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    }
                });
时间: 2024-09-30 21:09:21

下拉刷新与上拉更多(用SwipeRefreshLayout和ListView实现)的相关文章

Android XListView下拉刷新、上拉载入更多

source code: https://github.com/Maxwin-z/XListView-Android 提供了两个接口: a) IXListViewListener:  触发下拉刷新.上拉载入更多 b) OnXScrollListener: 这个和原生的OnScrollListener一样,但是在mScroller回滚时,也会触发这里的事件. bug fix 例子很好哦,不过有一个BUG,就是当最开始数据不能撑满屏幕的时候,也就是比如有1条,那么将ListView向上拉不会完美刷新

下拉刷新与上拉加载更多

代码如下: /** * ListView下拉刷新和加载更多 * <p> * * <strong>变更说明:</strong> * <p> * 默认如果设置了OnRefreshListener接口和OnLoadMoreListener接口 * <p> * 剩余三个Flag: <br> * mIsAutoLoadMore(是否自动加载更多) <br> * mIsMoveToFirstItemAfterRefresh(下拉刷新后

Android PullToRefresh 下拉刷新,上拉更多,支持ScrollView,ListView,可方便拓展GridView,WebView等

在写着东西之前,从网上找到很多这方面的源码,但是基本没有找到满意的,包括在GitHub上的比较有名的Android-PullToRefresh-master,思来想去还是自己写吧,当然其中借鉴了一些别的开源代码! 废话不多说,直接上代码,注释很全乎,应该不难理解,Demo下载地址在最后: package com.zs.pulltorefreshtest; import android.content.Context; import android.util.AttributeSet; impor

vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版

在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://www.cnblogs.com/sichaoyun/p/6647458.html <template lang="html"> <div class="yo-scroll" :class="{'down':(state===0),'up':(st

ListView下拉刷新、上拉载入更多之封装改进

在Android中ListView下拉刷新.上拉载入更多示例一文中,Maxwin兄给出的控件比较强大,前面有详细介绍,但是有个不足就是,里面使用了一些资源文件,包括图片,String,layout,这样不利于封装打包,下面我将源码进行改进,所有布局全部用代码实现,这样直接将src和assets打包成jar就成了一个非常方便以后使用的扩展ListView控件,代码如下: XListView: /** * @file XListView.java * @package me.maxwin.view

微信小程序页面事件-下拉刷新,上拉加载更多

1.下拉刷新的概念及应用场景. 概念: 下拉刷新是移动端更新列表数据的交互行为,用户通过手指在屏幕上子上而下的滑动,可以触发页面的下拉刷新,更新列表数据. 应用场景: 在移动端,数据列表是常见的页面效果,更新列表数据是最基本的页面需求,相比于按钮刷新,定时刷新来说,下拉刷新的用户体验方便友好,已经成为移动端刷新列表数据的最佳解决方案. 微信小程序启动下拉刷新: 两种方式: 1.需要在app.json 的window选项中或页面配置中开启enablePullDownRefresh, 但是,一般情况

Android自定义控件——ListView的下拉刷新与上拉加载

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频繁的控件之一,ListView提供一个列表的容易,允许我们以列表的形式将数据展示到界面上,但是Google给我们提供的原生ListView的控件,虽然在功能上很强大,但是在用户体验和动态效果上,还是比较差劲的.为了改善用户体验,市面上纷纷出现了各种各样的自定义的ListView,他们功能强大,界面美

Android打造(ListView、GridView等)通用的下拉刷新、上拉自动加载的组件

前言 下拉刷新组件在开发中使用率是非常高的,基本上联网的APP都会采用这种方式.对于开发效率而言,使用获得大家认可的开源库必然是效率最高的,但是不重复发明轮子的前提是你得自己知道轮子是怎么发明出来的,并且自己能够实现这些功能.否则只是知道其原理,并没有去实践那也就是纸上谈兵了.做程序猿,动手做才会遇到真正的问题,否则就只是自以为是的认为自己懂了.今天这篇文章就是以自己重复发明轮子这个出发点而来的,通过实现经典.使用率较高的组件来提高自己的认识.下面我们就一起来学习吧. 整体布局结构      

iscroll 下拉刷新,上拉加载

新手,直接贴代码了 <!DOCTYPE html><html class=""><head lang="en"><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content=&

Android学习之listview的下拉刷新、上拉载入

本例是在上例的基础上完成的.本例实现的listview上拉载入.下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header. 1.listview_footer listview_footer是listview的底部. 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http