自定义下拉刷新上拉加载的帮助接口ScrollableHelper
来源:互联网 发布:centos安装图形化界面 编辑:程序博客网 时间:2024/05/18 01:48
现在写Android项目一般都会用到下拉创新以及上拉加载的功能,要想实现这一功能,就必须要在fragment和activity上实现Scrollable这一功能,基于这一功能,我整理了一下自己写的接口类ScrollableHelper,主要用于为fragment加上相应的功能,这里开始讲一下ScrollableHelper。
首先定义一个接口,用于得到fragment所包含的的view包括ScrollView/ListView/RecycelerView等。代码如图:
/** * a viewgroup whitch contains ScrollView/ListView/RecycelerView.. */ public interface ScrollableContainer{ /** * @return ScrollView/ListView/RecycelerView..'s instance */ View getScrollableView(); } public void setCurrentScrollableContainer(ScrollableContainer scrollableContainer) { this.mCurrentScrollableCainer = scrollableContainer; } private View getScrollableView() { if (mCurrentScrollableCainer == null) { return null; } return mCurrentScrollableCainer.getScrollableView(); }
再接下来就是具体的实现判断各种view是否处于可以滑动的状态,以及滑动到了的状态,即该view是否是在滑动顶部等。具体的代码实现如下:
/** * * 判断是否滑动到顶部方法,ScrollAbleLayout根据此方法来做一些逻辑判断 * 目前只实现了AdapterView,ScrollView,RecyclerView * 需要支持其他view可以自行补充实现 * @return */ public boolean isTop() { View scrollableView = getScrollableView(); if (scrollableView == null) {// throw new NullPointerException("You should call ScrollableHelper.setCurrentScrollableContainer() to set ScrollableContainer."); return true; } if (scrollableView instanceof AdapterView) { return isAdapterViewTop((AdapterView) scrollableView); } if (scrollableView instanceof ScrollView) { return isScrollViewTop((ScrollView) scrollableView); } if (scrollableView instanceof RecyclerView) { return isRecyclerViewTop((RecyclerView) scrollableView); } if (scrollableView instanceof WebView) { return isWebViewTop((WebView) scrollableView); } throw new IllegalStateException("scrollableView must be a instance of AdapterView|ScrollView|RecyclerView"); } private static boolean isRecyclerViewTop(RecyclerView recyclerView) { if (recyclerView != null) { RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { int firstVisibleItemPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition(); View childAt = recyclerView.getChildAt(0); if (childAt == null || (firstVisibleItemPosition == 0 && childAt.getTop() == 0)) { return true; } } } return false; } private static boolean isAdapterViewTop(AdapterView adapterView){ if(adapterView != null){ int firstVisiblePosition = adapterView.getFirstVisiblePosition(); View childAt = adapterView.getChildAt(0); if(childAt == null || (firstVisiblePosition == 0 && childAt.getTop() == 0)){ return true; } } return false; } private static boolean isScrollViewTop(ScrollView scrollView){ if(scrollView != null) { int scrollViewY = scrollView.getScrollY(); return scrollViewY <= 0; } return false; } private static boolean isWebViewTop(WebView scrollView){ if(scrollView != null) { int scrollViewY = scrollView.getScrollY(); return scrollViewY <= 0; } return false; } @SuppressLint("NewApi") public void smoothScrollBy(int velocityY, int distance, int duration) { View scrollableView = getScrollableView(); if (scrollableView instanceof AbsListView) { AbsListView absListView = (AbsListView) scrollableView; if (Build.VERSION.SDK_INT >= 21) { absListView.fling(velocityY); } else { absListView.smoothScrollBy(distance, duration); } } else if (scrollableView instanceof ScrollView) { ((ScrollView) scrollableView).fling(velocityY); } else if (scrollableView instanceof RecyclerView) { ((RecyclerView) scrollableView).fling(0, velocityY); } else if (scrollableView instanceof WebView) { ((WebView) scrollableView).flingScroll(0, velocityY); } }
简单的实现的一个帮助接口,使各种view的滑动加以集成,并且使得实现下拉刷新上拉加载这一功能更加顺滑,希望对大家有所帮助。
阅读全文
0 0
- 自定义下拉刷新上拉加载的帮助接口ScrollableHelper
- 自定义下拉刷新上拉加载动画
- 自定义ListView下拉刷新上拉加载
- Android 自定义下拉刷新上拉加载
- 自定义ListView----->下拉刷新,上拉加载
- 自定义下拉刷新上拉加载View
- 自定义ListView下拉刷新,上拉加载
- 自定义上拉刷新下拉加载ScrollView
- google官方的下拉刷新+自定义上拉加载更多
- google官方的下拉刷新+自定义上拉加载更多
- 自定义listView 的下拉刷新上拉加载
- 自定义控件-下拉刷新和上拉加载的listView
- 自定义listview的下拉刷新和上拉加载
- 自定义下拉刷新和上拉加载的recycleview
- 自定义ListView的下拉刷新和上拉加载更多
- Google官方的下拉刷新+自定义上拉加载更多
- YRecyclerView自定义下拉刷新上拉加载更多的RecyclerView
- google官方的下拉刷新+自定义上拉加载更多
- 我为何需要使用空接口?
- Html.fromHtml利用Textview显示html文本
- marry
- 第四讲 属性名和字段名不一致的处理
- NHibernate 1.0 Released 版本发布了
- 自定义下拉刷新上拉加载的帮助接口ScrollableHelper
- 深度学习网络模型AlexNet
- [Python模块学习]用colorsys模块转换颜色模型,常见颜色模型简介(RGB/HSV/HSL/YIQ)
- 许久不见
- app\build\intermediates\res\merged\debug\values-v24\values-v24.xml
- 升级个人网站框架组件IBatisNet+Castle
- 【POI2013】bzoj3426 Tower Defence Game
- 第五讲 分页的实现
- css 空心箭头