Android
来源:互联网 发布:口腔耗材淘宝哪家好 编辑:程序博客网 时间:2024/05/22 23:59
1. 监听思路
NestedScrollView
内嵌 RecyclerView
时,RecyclerView
的滑动监听很大可能监听不到,所以我们只能通过对NestedScrollView
的监听进行RecyclerView
的滑动判断;
2. 基本布局
别问我为什么有这种布局,你也会遇到的;(通用布局)
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/baseSwipeRefresh" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v4.widget.NestedScrollView android:id="@+id/baseViewContent" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" android:scrollbars="none" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/baseViewPager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> </android.support.v4.widget.NestedScrollView> </android.support.v4.widget.SwipeRefreshLayout>
这里注意 需要给 NestedScrollView
添加下面属性:
android:fillViewport="true"
3. RecyclerView
初始化
//设置layoutManager LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext); // auto measure : true linearLayoutManager.setSmoothScrollbarEnabled(true); linearLayoutManager.setAutoMeasureEnabled(true); linearLayoutManager.setOrientation(VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); // 设置为 true recyclerView.setHasFixedSize(true); recyclerView.setItemAnimator(new DefaultItemAnimator()); // 设置为 false recyclerView.setNestedScrollingEnabled(false);
4. NestedScrollView
滑动监听
mNestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { if (scrollY > oldScrollY) { // 向下滑动 } if (scrollY < oldScrollY) { // 向上滑动 } if (scrollY == 0) { // 顶部 } if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) { // 底部 } } });
5. 结语
好吧,通过对 NestedScrollView
的监听,对RecyclerView
的数据操作即可!
6. 题外话(一) RecyclerView
的滑动监听
简单实现
RecyclerView
的监听
重写滑动监听事件
/** * 重写RecyclerView.OnScrollListener 判断滑动向上,向下,顶部,底部 */ public static abstract class OnVerticalScrollListener extends RecyclerView.OnScrollListener { @Override public final void onScrolled(RecyclerView recyclerView, int dx, int dy) { LogUtil.e("ddd" + dy); if (!recyclerView.canScrollVertically(-1)) { onScrolledToTop(); } else if (!recyclerView.canScrollVertically(1)) { onScrolledToBottom(); } else if (dy < 0) { onScrolledUp(); } else if (dy > 0) { onScrolledDown(); } } //向上滑动 public void onScrolledUp() { } //向下滑动 public void onScrolledDown() { } //滑动底部 public void onScrolledToTop() { } //滑动顶部 public void onScrolledToBottom() { } }
使用
protected RecyclerView.OnScrollListener getOnScrollListener() { //上下滑动监听 return new OnVerticalScrollListener() { @Override public void onScrolledToBottom() { if (!isLoading) { page++; onLoadNextPage(page); isLoading = true; } } }; }
7. 题外话(二)RecyclerAdapter
的数据改变监听
给 adapter 注册一个观察者,执行下面notifyxxx
方法的时候,会调用方法;
notifyDataSetChanged()
notifyItemChanged()
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); checkAdapterEmpty(); } @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); checkAdapterEmpty(); } @Override public void onItemRangeRemoved(int positionStart, int itemCount) { super.onItemRangeRemoved(positionStart, itemCount); checkAdapterEmpty(); } });
完
0 0
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- android
- android
- Android
- Android
- android!!!
- android
- android
- android
- android
- android:
- 递归&循环实现Fibonacci数列
- java反射之获取对象信息
- Android 消息处理
- JavaScript子类用Object.getPrototypeOf去调用父类方法
- 山科大第四届校赛 字符串“水”题
- Android
- effective java 读书笔记---第11章 序列化
- Pioneer3-AT + Hokuyo UTM30LX + MRPT 搭建遥控地面移动SLAM平台
- 深入浅出UML类图
- 运用运行时来储存信息
- HTML div即父容器不根据内容自适应高度的原因及解决方法
- 独家|一文读懂非关系型数据库
- 蓝桥杯 “拼音字母”
- 如何在神箭手上快速开发爬虫——第一课 简单的文章爬虫【糗事百科】