Android进阶之路 - RecyclerView 滑动顶部实现过程与ScrollListener内部方法理解
2018-01-24 11:56
766 查看
实现范围 :
当RecyclerView滑动到一定距离或者条目之后,通过监听第一可见条目或最后一条可见条目,显示置顶按钮,点击触发跳转到第一条目 。
Effect :
本章所学 :
1.滑动到指定的Position位置
2.滑动状态的监听与逻辑操作
3.实现置顶功能
需了解部分 :
RecyclerView下的onScrollStateChanged的俩个回调方法
onScrollStateChanged中参数介绍
onScrolled中参数介绍 :
RecyclerView下的onScrollStateChanged滑动的三种状态
获取可见的第一条目与最后条目
完整代码
MainActivity :
MyAdapter :
MainActivity Xml :
借鉴的文章地址 :
RecyclerView制定位置滑动置顶,并实现头部悬停
RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)
RecycleViewScrollHelper–RecyclerView滑动事件检测的辅助类
当RecyclerView滑动到一定距离或者条目之后,通过监听第一可见条目或最后一条可见条目,显示置顶按钮,点击触发跳转到第一条目 。
Effect :
本章所学 :
1.滑动到指定的Position位置
2.滑动状态的监听与逻辑操作
3.实现置顶功能
需了解部分 :
RecyclerView下的onScrollStateChanged的俩个回调方法
//当recycleView的滑动状态改变时回调 public void onScrollStateChanged(RecyclerView recyclerView, int newState){} //当RecycleView滑动之后被回调 public void onScrolled(RecyclerView recyclerView,int dx, int dy){}
onScrollStateChanged中参数介绍
newState代表滑动状态,三种状态都在下面
onScrolled中参数介绍 :
其中dx,dy分别表示 在x方向和y方向滑动的值,这个值有正负。 如果 dx>0 则表示 右滑 , dx<0 表示 左滑 dy <0 表示 上滑, dy>0 表示下滑 通过这几个参数就可以监听 滑动方向的状态。
RecyclerView下的onScrollStateChanged滑动的三种状态
/** * 当前的recycleView不滑动(滑动已经停止时) */ public static final int SCROLL_STATE_IDLE = 0; /** * 当前的recycleView被拖动滑动 */ public static final int SCROLL_STATE_DRAGGING = 1; /** * 当前的recycleView在滚动到某个位置的动画过程,但没有被触摸滚动.调用 scrollToPosition(int) 应该会触发这个状态 */ public static final int SCROLL_STATE_SETTLING = 2;
获取可见的第一条目与最后条目
//获取RecyclerView下的layoutManager, “注意要强转为 LinearLayoutManager“ RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); //第一条目 int lastVisibleItemPosition = linearManager.findLastVisibleItemPosition(); //最后条目 int firstVisibleItemPosition = linearManager.findFirstVisibleItemPosition();
完整代码
MainActivity :
package com.example.yongliu.firstposition; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private View mVisBtn; private RecyclerView mRv; private ArrayList<String> data; private MyAdapter myAdapter; private LinearLayoutManager linearLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getData(); mRv = (RecyclerView) findViewById(R.id.rv); mVisBtn = findViewById(R.id.iv_btn); linearLayoutManager = new LinearLayoutManager(this); mRv.setLayoutManager(linearLayoutManager); myAdapter = new MyAdapter(data); mRv.setAdapter(myAdapter); mRv.addOnScrollListener(new RecyclerView.OnScrollListener() { int mScrollThreshold; private LinearLayoutManager linearManager; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if(layoutManager instanceof LinearLayoutManager){ linearManager = (LinearLayoutManager) layoutManager; int lastVisibleItemPosition = linearManager.findLastVisibleItemPosition(); int firstVisibleItemPosition = linearManager.findFirstVisibleItemPosition(); /** * 判断可见的第一个条目 * */ if(newState == RecyclerView.SCROLL_STATE_IDLE&&firstVisibleItem 4000 Position+1>10){ mVisBtn.setVisibility(View.VISIBLE); }else{ mVisBtn.setVisibility(View.GONE); } /** * 判断可见条目是否已经到底 * */ // if(newState == RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItemPosition+1==myAdapter.getItemCount()){ // mVisBtn.setVisibility(View.VISIBLE); // }else{ // mVisBtn.setVisibility(View.GONE); // } Log.e("tag","lastCompletelyVisibleItemPosition ="+lastVisibleItemPosition+1); Log.e("tag","myAdapter.getItemCount() ="+myAdapter.getItemCount()); Log.e("tag","newState="+newState); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); boolean isSignificantDelta = Math.abs(dy) > mScrollThreshold; if(isSignificantDelta ){ if(dy>0){ onScrollUp(); }else{ onScrollDown(); } } } }); mVisBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mRv.scrollToPosition(0); mVisBtn.setVisibility(View.GONE); } }); } /** * 上滑监听 */ private void onScrollUp() { mVisBtn.setVisibility(View.VISIBLE); } /** * 下滑监听 */ private void onScrollDown() { mVisBtn.setVisibility(View.GONE); } /** * 加入数据 * */ private ArrayList<String> getData() { data = new ArrayList<>(); String temp = " item"; for(int i = 0; i < 50; i++) { data.add(i + temp); } return data; } }
MyAdapter :
package com.example.yongliu.firstposition; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; /** * author yongliu * date 2018/1/23. * desc: */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private ArrayList<String> mData; public MyAdapter(ArrayList<String> mData) { this.mData = mData; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.mItemText.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size()>0?mData.size():0; } public class MyViewHolder extends RecyclerView.ViewHolder { private final TextView mItemText; public MyViewHolder(View itemView) { super(itemView); mItemText = (TextView) itemView.findViewById(R.id.item_view); } } }
MainActivity Xml :
<?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:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.yongliu.firstposition.MainActivity"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rv" /> <ImageView android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/iv_btn" android:src="@mipmap/up" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="15dp" android:visibility="gone" android:layout_marginRight="15dp" /> </RelativeLayout>
借鉴的文章地址 :
RecyclerView制定位置滑动置顶,并实现头部悬停
RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)
RecycleViewScrollHelper–RecyclerView滑动事件检测的辅助类
相关文章推荐
- Android 解析RecyclerView(3)——以更简单的方法实现带顶部View和底部View的RecyclerView
- android中实现view可以滑动的六种方法
- Android TabLayout、ViewPager实现顶部和底部Tab导航 点击滑动切换Tab页面
- Android实现浮层的上下滑动(支持内部添加View)
- Android :ViewPager+Fragment 实现顶部导航滑动效果
- Android ViewPager和Fragment实现顶部导航界面滑动效果
- Android ViewPager和Fragment实现顶部导航界面滑动效果
- Android中实现Webview顶部带进度条的方法
- Android App使用RecyclerView实现上拉和下拉刷新的方法
- Android View体系(二)实现View滑动的六种方法
- android RecyclerView首字母悬浮在顶部,滑动删除
- Android ViewPager实现上一页下一页左右滑动的正确方法
- Android实现评论栏随Recyclerview滑动左右移动
- android RecyclerView首字母悬浮在顶部,滑动删除
- Android中实现Webview顶部带进度条的方法
- android中实现view可以滑动的六种方法续篇(一)
- Android中实现Webview顶部带进度条的方法
- Androin学习笔记五十三: Android中实现view可以滑动的六种方法
- Android编程实现ViewPager多页面滑动切换及动画效果的方法