次のコードを書いてみました
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy > 0){
//scrolling up
} else {
//scrolling down
int pastVisibleItems = linearLayoutManager.findFirstVisibleItemPosition();
if (pastVisibleItems == 0) {
Toast.makeText(getContext(),"Top most item",Toast.LENGTH_SHORT).show();
}
}
}
しかし、それは機能しません。また、AndroidのSwipeRefreshLayoutを使用してこれを実行しようとしました。これは、ユーザーが一番上のアイテムにスクロールしたときに検出できる必要な処理を実行するためです。ローディングインジケータが飛び出すのを防ぐことができないようであるため、使用しないことにしました(ローディングインジケータがまったく出てこないようにしたい)。
だから、基本的に私がやりたいことは:
これを達成する方法はありますか?
ありがとう。
私は自分の質問を自分で解決しました。代わりに以下のコードを使用しました
private boolean isUserScrolling = false;
private boolean isListGoingUp = true;
次に、RecyclerViewOnScrollListenerで
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//detect is the topmost item visible and is user scrolling? if true then only execute
if(newState == RecyclerView.SCROLL_STATE_DRAGGING){
isUserScrolling = true;
if(isListGoingUp){
//my recycler view is actually inverted so I have to write this condition instead
if(linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 == list.size()){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(isListGoingUp) {
if (linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 == list.size()) {
Toast.makeText(getContext(),"exeute something", Toast.LENGTH_SHORT).show();
}
}
}
},50);
//waiting for 50ms because when scrolling down from top, the variable isListGoingUp is still true until the onScrolled method is executed
}
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(isUserScrolling){
if(dy > 0){
//means user finger is moving up but the list is going down
isListGoingUp = false;
}
else{
//means user finger is moving down but the list is going up
isListGoingUp = true;
}
}
}
コードを以下のコードに置き換えます。
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int pastVisibleItems = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
if (pastVisibleItems == 0) {
Toast.makeText(getContext(),"Top most item",Toast.LENGTH_SHORT).show();
}
}
エラーが発生した場合はコメントしてください。
あなたはこれを簡単にコードを使用して行うことができます
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(newState == RecyclerView.SCROLL_STATE_DRAGGING) {
isUserScrolling = true;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(isUserScrolling){
if(dy > 0){
//Scroll list Down
}
else{
if(!recyclerView.canScrollVertically(-1)){
//This Your Top View do Something
}
}
}
}
});