前言
在android開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)用到列表控件RecyclerView,而與RecyclerView相關(guān)的又會(huì)涉及很多監(jiān)聽(tīng)。為了方便使用,我封裝了一個(gè)RecyclerView的滑動(dòng)監(jiān)聽(tīng)類(lèi)RecycleScrollListener,其可以監(jiān)聽(tīng)RecyclerView的是否滑動(dòng),滑動(dòng)位置(是否在頂部,是否在底部),滑動(dòng)方向(向上,向下滑動(dòng))。那么下面就讓我們來(lái)了解下RecycleScrollListener的使用吧。
今天涉及以下內(nèi)容:
-
RecycleScrollListener監(jiān)聽(tīng)講解
1.1 監(jiān)聽(tīng)是否滑動(dòng)
1.2 監(jiān)聽(tīng)是否滑動(dòng)到列表 頂部/底部
1.3 監(jiān)聽(tīng)是否 向上/向下 滑 -
RecycleScrollListener在Activity中的使用 - 效果圖和項(xiàng)目結(jié)構(gòu)圖
-
RecycleScrollListener源碼
先來(lái)波效果圖

是否滑動(dòng)監(jiān)聽(tīng).gif

滑動(dòng)位置監(jiān)聽(tīng).gif

滑動(dòng)方向監(jiān)聽(tīng).gif
一. RecycleScrollListener 監(jiān)聽(tīng)講解
RecycleScrollListener作為一個(gè)RecyclerView的監(jiān)聽(tīng)類(lèi),可以監(jiān)聽(tīng)RecyclerView是否滑動(dòng),滑動(dòng)位置(頂部/底部),滑動(dòng)方向(向上/向下),下面來(lái)一次講解。
1.1 監(jiān)聽(tīng)是否滑動(dòng)
監(jiān)聽(tīng)RecyclerView是否滑動(dòng)可以像下面這樣處理:
RecycleScrollListener scrollListener=new RecycleScrollListener();
//是否滑動(dòng)監(jiān)聽(tīng)
scrollListener.setOnScrollStateListener(new RecycleScrollListener.OnScrollStateListener() {
@Override
public void scrollState(boolean isScrolling) {
if(isScrolling){
ToastUtil.shortShow("正在滑動(dòng)");
LogUtil.i("======正在滑動(dòng)======");
}else{
ToastUtil.shortShow("未滑動(dòng)");
LogUtil.i("======未滑動(dòng)======");
}
}
});
mRecyclerView.addOnScrollListener(scrollListener);
1.2 監(jiān)聽(tīng)是否滑動(dòng)到列表 頂部/底部
監(jiān)聽(tīng)RecyclerView是否滑動(dòng)到列表頂部/底部 可以類(lèi)似下面這樣:
RecycleScrollListener scrollListener=new RecycleScrollListener();
//滑動(dòng)位置監(jiān)聽(tīng)
scrollListener.setOnScrollPositionListener(new RecycleScrollListener.OnScrollPositionListener() {
@Override
public void scrollPosition(int position) {
switch (position) {
case RecycleScrollListener.SCROLL_TOP:
ToastUtil.shortShow("頂部");
LogUtil.i("====頂部====");
break;
case RecycleScrollListener.SCROLL_BOTTOM:
ToastUtil.shortShow("底部");
LogUtil.i("====底部====");
break;
default:
// ToastUtil.shortShow("非頂部和底部的位置");
// LogUtil.i("====非頂部和底部的位置====");
break;
}
}
});
mRecyclerView.addOnScrollListener(scrollListener);
1.3 監(jiān)聽(tīng)是否 向上/向下 滑
監(jiān)聽(tīng)列表是否 向上/向下 滑,可以像下面這樣操作:
RecycleScrollListener scrollListener=new RecycleScrollListener();
//滑動(dòng)方向監(jiān)聽(tīng)
scrollListener.setOnScrollDirectionListener(new RecycleScrollListener.OnScrollDirectionListener() {
@Override
public void scrollUp(int dy) {
ToastUtil.shortShow("向上滑");
LogUtil.i("====向上滑====");
}
@Override
public void scrollDown(int dy) {
ToastUtil.shortShow("向下滑");
LogUtil.i("====向下滑====");
}
});
mRecyclerView.addOnScrollListener(scrollListener);
二. RecycleScrollListener 在 Activity 中的使用
下面給出RecycleScrollListener在 Activity中使用的樣例:
package com.testdemo.example_ui;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.testdemo.R;
import com.testdemo.other.MyAdapter;
import com.testdemo.other.RecycleScrollListener;
import com.util.LogUtil;
import com.util.ToastUtil;
import java.util.ArrayList;
import java.util.List;
/**
* Title:測(cè)試界面
* description:
* autor:pei
* created on 2020/6/2
*/
public class TempActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mTv;
private Button mBtn1;
private RecyclerView mRecyclerView;
private MyAdapter<String>myAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp);
//初始化控件
initView();
//初始化數(shù)據(jù)
initData();
//設(shè)置監(jiān)聽(tīng)
setListener();
}
/**初始化控件**/
private void initView(){
mTv=findViewById(R.id.tv);
mBtn1=findViewById(R.id.btn1);
mRecyclerView=findViewById(R.id.rv);
}
/**初始化數(shù)據(jù)**/
private void initData(){
List<String>list=new ArrayList<>();
for (int i = 0; i < 30; i++) {
list.add("測(cè)試數(shù)據(jù) "+i);
}
myAdapter=new MyAdapter<>(TempActivity.this,list);
LinearLayoutManager layoutManager = new LinearLayoutManager(TempActivity.this);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(myAdapter);
RecycleScrollListener scrollListener=new RecycleScrollListener();
// //是否滑動(dòng)監(jiān)聽(tīng)
// scrollListener.setOnScrollStateListener(new RecycleScrollListener.OnScrollStateListener() {
// @Override
// public void scrollState(boolean isScrolling) {
// if(isScrolling){
// ToastUtil.shortShow("正在滑動(dòng)");
// LogUtil.i("======正在滑動(dòng)======");
// }else{
// ToastUtil.shortShow("未滑動(dòng)");
// LogUtil.i("======未滑動(dòng)======");
// }
// }
// });
// //滑動(dòng)位置監(jiān)聽(tīng)
// scrollListener.setOnScrollPositionListener(new RecycleScrollListener.OnScrollPositionListener() {
// @Override
// public void scrollPosition(int position) {
// switch (position) {
// case RecycleScrollListener.SCROLL_TOP:
// ToastUtil.shortShow("頂部");
// LogUtil.i("====頂部====");
// break;
// case RecycleScrollListener.SCROLL_BOTTOM:
// ToastUtil.shortShow("底部");
// LogUtil.i("====底部====");
// break;
// default:
//// ToastUtil.shortShow("非頂部和底部的位置");
//// LogUtil.i("====非頂部和底部的位置====");
// break;
// }
// }
// });
//滑動(dòng)方向監(jiān)聽(tīng)
scrollListener.setOnScrollDirectionListener(new RecycleScrollListener.OnScrollDirectionListener() {
@Override
public void scrollUp(int dy) {
ToastUtil.shortShow("向上滑");
LogUtil.i("====向上滑====");
}
@Override
public void scrollDown(int dy) {
ToastUtil.shortShow("向下滑");
LogUtil.i("====向下滑====");
}
});
mRecyclerView.addOnScrollListener(scrollListener);
}
/**設(shè)置監(jiān)聽(tīng)**/
private void setListener(){
mBtn1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1://測(cè)試
LogUtil.i("=======測(cè)試=======");
test();
break;
default:
break;
}
}
/**測(cè)試**/
private void test(){
}
}
三. 效果圖和項(xiàng)目結(jié)構(gòu)圖

是否滑動(dòng)監(jiān)聽(tīng).gif

滑動(dòng)位置監(jiān)聽(tīng).gif

滑動(dòng)方向監(jiān)聽(tīng).gif

項(xiàng)目結(jié)構(gòu)圖.png
四. RecycleScrollListener 源碼
下面給出RecycleScrollListener源碼: