06/21
2013

下拉刷新及滚动到底部加载更多的Listview使用

本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用。

该ListView优点包括:a. 可自定义下拉响应事件(如下拉刷新)  b.可自定义滚动到底部响应的事件(如滑动到底部加载更多)  c.可自定义丰富的样式  d.高效(若下拉样式关闭不会加载其布局,同listView效率一致) e. 丰富的设置。

更多下拉刷新开源项目可见  Android 下拉刷新。底部加载更多开源项目可见  Android 底部加载更多

 

Demo APK 可以方便的查看效果,在各大应用商店搜索 trinea android 下载即可,如:Google Play

可运行代码地址可见DropDownListViewDemo,效果图如下:

drop Down To Refresh Load More ListView

 

1、引入公共库

引入TrineaAndroidCommon@Github(欢迎star和fork^_^)作为你项目的library(如何拉取代码及添加公共库),或是自己抽取其中的DropDownListView@Github部分使用。

 

2、在layout中定义
将布局中的ListView标签换成cn.trinea.android.common.view.DropDownListView标签
并加上自定义属性的命名空间xmlns:listViewAttr=”http://schemas.android.com/apk/res/cn.trinea.android.demo”,其中cn.trinea.android.demo需要用自己的包名替换。如何自定义属性及其命名空间可见本文最后。xml代码如下:

DropDownListView自定义了三个boolean属性

isDropDownStyle表示是否允许下拉样式,java代码中可自定义下拉listener,表示需要完成的任务

isOnBottomStyle表示是否允许底部样式,java代码中可自定义滚动到底部的listener,表示需要完成的任务
isAutoLoadOnBottom表示是否允许滚动到底部时自动执行对应listener,仅在isOnBottomStyle为true时有效

PS:如果isDropDownStyle或isOnBottomStyle为false,并不会加载对应的布局,所以性能同ListView一样。

 

3、在Java类中调用
通过setOnDropDownListener设置下拉的事件,不过需要在事件结束时手动调用onDropDownComplete恢复状态(注意需要在adapter.notifyDataSetChanged();后面调用)
通过setOnBottomListener设置滚动到底部的事件,不过需要在事件结束时手动调用onBottomComplete恢复状态,示例代码如下:

 

 

4、高级接口设置

public void setOnDropDownListener(OnDropDownListener onDropDownListener)设置下拉的事件
public void onDropDownComplete()和public void onDropDownComplete(CharSequence secondText)恢复下拉状态,注意onDropDownComplete需要在adapter.notifyDataSetChanged();后面调用

 

public void setOnBottomListener(OnClickListener onBottomListener)设置滚动到底部的事件
public void onBottomComplete()恢复底部状态

 

public void setSecondPositionVisible()
在isDropDownStyle为true情况下,drop down的header layout为ListView position为0的item,所以可能需要调用(如adapter.notifyDataSetChanged())setSecondPositionVisible()设置position为1(即第二个)的item可见。setSelection(0)滚动到的header layout的item。onDropDownComplete()默认已经调用setSecondPositionVisible()

 

public void setDropDownStyle(boolean isDropDownStyle)同xml中的isDropDownStyle属性,表示是否为下拉样式,下拉释放后执行onDropDownListener
public void setOnBottomStyle(boolean isOnBottomStyle)同xml中isOnBottomStyle属性,表示滚动到底部执行onBottomListener样式
public void setAutoLoadOnBottom(boolean isAutoLoadOnBottom)同xml中isAutoLoadOnBottom属性,表示滚动到底部是否自动执行onBottomListener

 

public void setHeaderPaddingTopRate(float headerPaddingTopRate)设置header padding top距离与实际下拉距离的比例
public void setHeaderReleaseMinDistance(int headerReleaseMinDistance)设置header可释放执行onDropDownListener的最小距离

public void setShowFooterProgressBar(boolean isShowFooterProgressBar)设置底部是否显示progressbar

 

public void setHasMore(boolean hasMore)set whether has more
public void setHeaderDefaultText(String headerDefaultText)设置header默认文字, default is R.string.drop_down_list_header_default_text
public void setHeaderPullText(String headerPullText)设置header下拉提示文字, default is R.string.drop_down_list_header_pull_text
public void setHeaderReleaseText(String headerReleaseText)设置header可释放提示文字, default is R.string.drop_down_list_header_release_text
public void setHeaderLoadingText(String headerLoadingText)设置header加载中提示文字, default is R.string.drop_down_list_header_loading_text
public void setFooterDefaultText(String footerDefaultText)设置footer默认文字, default is R.string.drop_down_list_footer_default_text
public void setFooterLoadingText(String footerLoadingText)设置footer加载中提示文字, default is R.string.drop_down_list_footer_loading_text
public void setFooterNoMoreText(String footerNoMoreText)设置footer没有更多提示文字, default is R.string.drop_down_list_footer_no_more_text
public void setHeaderSecondText(CharSequence secondText)设置header第二部分文字, default is null

 

5、样式设置(自定义header和footer信息)
将TrineaAndroidCommon作为lib引入之后,可以在自己工程内重定义某些资源,覆盖TrineaAndroidCommon中的设置。

自定义下拉的图片,在项目drawable资源下添加文件名为drop_down_list_arrow.png的图片即可

 

定义相关文字,strings.xml中定义下面属性:

 

定义相关字体颜色,colors.mxl中定义下面属性:

 

定义相关样式(会覆盖前面的string和color定义),styles.xml中定义下面属性:

 

定义相关dimen值,dimens.xml中定义下面属性:

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

184 thoughts on “下拉刷新及滚动到底部加载更多的Listview使用

  1. 1.
    /**
    * get attrs
    *
    * @param context
    * @param attrs
    */
    private void getAttrs(Context context, AttributeSet attrs) {
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.drop_down_list_attr);
    isDropDownStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isDropDownStyle, true);
    isOnBottomStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isOnBottomStyle, true);
    isAutoLoadOnBottom = ta.getBoolean(R.styleable.drop_down_list_attr_isAutoLoadOnBottom, false);
    ta.recycle();
    }
    这里的 isDropDownStyle等属性都默认为空比较好,可以选择当用户设置listener的时候再选择是否开启dropdown以及onbottom.

    2.onBottom设置状态,当需要onBottom的时候判断下然后如果有可以就修改状态位,等用户回调以后再恢复状态即可。
    3.onScroll那里对onBottom那里限制的太死了..必须显示出来以后再进行onBottom,这个用户体验不好,最好是判断到倒数的几个的时候就可以进行onBottom的触发了,那个会更好点。

    • 感谢你的反馈
      第1个问题我的想法是默认下拉和底部更多样式都开启,因为用户使用的话肯定是需要两个样式或之一,没有数据判断哪个样式更常用,所以就默认都开启。如果在setListener里面开启dropdown以及onbottom,导致这个接口做了两件事情,会有一定的误解。更多时候在xml中定义了样式就不会再变。
      第2个建议非常好,之前我也在想怎么解决onBottom被多次调用的问题,非常感谢,我会尽快修复这个问题提交。
      第3个问题我的使用场景没这种要求,不过也是个不错的建议,后面会把这个地方改为可设置

      • 实际上我提出第一个问题主要是想在不设置属性的情况下直接当作普通的listView来使用的~因此设计的时候是希望在设置不同的Listener来开启不同的使用模式。

        • 关于默认值的问题你说的比较合适,不设置确实应该当作普通的对待。不过设置listener时开启对应的style还是觉得不合适,这个函数做了两件事,容易歧义跟setxxStyle函数

  2. 代码写的很整洁,看着就舒服。就是一个小时过去了,代码还没下载下来。

    Google code 半天打不开,时好时坏,还是用国内的代码托管吧。