您的位置:首页 > 移动开发 > Android开发

Android进阶之路 - RecyclerView 滑动顶部实现过程与ScrollListener内部方法理解

2018-01-24 11:56 766 查看
实现范围 :

当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滑动事件检测的辅助类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息