RecyclerView / LinearLayoutManager가 상단 또는 하단으로 스크롤되는지 확인하는 방법은 무엇입니까?
현재 다음 코드를 사용하여 SwipeRefreshLayout을 활성화해야하는지 확인하고 있습니다.
private void laySwipeToggle() {
if (mRecyclerView.getChildCount() == 0 || mRecyclerView.getChildAt(0).getTop() == 0) {
mLaySwipe.setEnabled(true);
} else {
mLaySwipe.setEnabled(false);
}
}
그러나 여기에 문제가 있습니다. 다른 항목의보기 경계로 스크롤하면 mRecyclerView.getChildAt(0).getTop()
0을 반환합니다.
RecyclerView.isScrolledToBottom()
또는 같은 것이 RecyclerView.isScrolledToTop()
있습니까?
편집 : (mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0)
종류의 RecyclerView.isScrolledToTop()
이지만 RecyclerView.isScrolledToBottom()
어떨까요?
해결책은 레이아웃 관리자에 있습니다.
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// Add this to your Recycler view
recyclerView.setLayoutManager(layoutManager);
// To check if at the top of recycler view
if(layoutManager.firstCompletelyVisibleItemPosition()==0){
// Its at top
}
// To check if at the bottom of recycler view
if(layoutManager.lastCompletelyVisibleItemPosition()==data.size()-1){
// Its at bottom
}
편집하다
항목 크기가 화면보다 큰 경우 다음을 사용하여 상위 이벤트를 감지하십시오.
RecyclerView recyclerView = (RecyclerView) view;
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int pos = linearLayoutManager.findFirstVisibleItemPosition();
if(linearLayoutManager.findViewByPosition(pos).getTop()==0 && pos==0){
return true;
}
추신 : 사실, 당신이 RecyclerView
직접 내부에 배치하면 SwipeRefreshview
이것을 할 필요가 없습니다
recyclerView.canScrollVertically(int direction)
스크롤이 가능한지 여부 만 알고 싶다면를 시도해 볼 수 있습니다 .
방향 정수 :
- -1 최대
- 아래로 1
- 0은 항상 거짓을 반환합니다.
RecyclerView
아래로 스크롤 되었는지 확인하기 위해 . 다음 코드를 사용하십시오.
/**
* Check whether the last item in RecyclerView is being displayed or not
*
* @param recyclerView which you would like to check
* @return true if last position was Visible and false Otherwise
*/
private boolean isLastItemDisplaying(RecyclerView recyclerView) {
if (recyclerView.getAdapter().getItemCount() != 0) {
int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
return true;
}
return false;
}
추가 정보
구현하려는 경우 ScrollToBottom
에 RecyclerView
때 Edittext
입니다 tapped
그럼 내가 추가하는 것이 좋습니다 일초 지연을 다음과 같이 :
edittext.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP)
if (isLastItemDisplaying(recyclerView)) {
// The scrolling can happen instantly before keyboard even opens up so to handle that we add 1 second delay to scrolling
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1);
}
}, 1000);
}
return false;
}
});
@Saren Arterius , RecycleView 의 addOnScrollListener를 사용하면 아래와 같이 Vertical RecycleView의 스크롤되는 상단 또는 하단을 찾을 수 있습니다.
RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy < 0) {
// Recycle view scrolling up...
} else if (dy > 0) {
// Recycle view scrolling down...
}
}
});
layoutManager에 대한 참조를 유지하고 다음과 같이 리사이클 러 뷰에서 onScrollListener를 설정하십시오.
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = mRecyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItemIndex = mLayoutManager.findFirstVisibleItemPosition();
//synchronizew loading state when item count changes
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading)
if ((totalItemCount - visibleItemCount) <= firstVisibleItemIndex) {
// Loading NOT in progress and end of list has been reached
// also triggered if not enough items to fill the screen
// if you start loading
loading = true;
} else if (firstVisibleItemIndex == 0){
// top of list reached
// if you start loading
loading = true;
}
}
}
});
recyclerView.canScrollVertically (int direction) 을 사용 하여 스크롤의 상단 또는 하단에 도달했는지 확인하십시오.
아래로 스크롤하는 경우 방향 = 1 (하단)
방향 = -1 (위로 스크롤)
메서드가 false를 반환하면 방향에 따라 상단 또는 하단에 도달했음을 의미합니다.
다음을 사용하여 상단을 감지 할 수 있습니다.
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(IsRecyclerViewAtTop())
{
//your recycler view reached Top do some thing
}
}
});
private boolean IsRecyclerViewAtTop() {
if(recyclerView.getChildCount() == 0)
return true;
return recyclerView.getChildAt(0).getTop() == 0;
}
당신이 도달 위에 한 번 손가락을 놓을 때 reacyclerview 최고 체크에 도달하는 즉시 당신이 감지하려는 경우, 상단을 감지 if(IsRecyclerViewAtTop())
내부 onScrolled
방법을
RecyclerView가 상단 또는 하단에 있음을 알기 위해 RecyclerViewHelper를 작성했습니다.
public class RecyclerViewHelper {
public static boolean isAtTop(RecyclerView recyclerView) {
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return isAtTopBeforeIceCream(recyclerView);
} else {
return !ViewCompat.canScrollVertically(recyclerView, -1);
}
}
private static boolean isAtTopBeforeIceCream(RecyclerView recyclerView) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int pos = linearLayoutManager.findFirstVisibleItemPosition();
if (linearLayoutManager.findViewByPosition(pos).getTop() == recyclerView.getPaddingTop() && pos == 0)
return true;
}
return false;
}
public static boolean isAtBottom(RecyclerView recyclerView) {
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return isAtBottomBeforeIceCream(recyclerView);
} else {
return !ViewCompat.canScrollVertically(recyclerView, 1);
}
}
private static boolean isAtBottomBeforeIceCream(RecyclerView recyclerView) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int count = recyclerView.getAdapter().getItemCount();
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int pos = linearLayoutManager.findLastVisibleItemPosition();
int lastChildBottom = linearLayoutManager.findViewByPosition(pos).getBottom();
if (lastChildBottom == recyclerView.getHeight() - recyclerView.getPaddingBottom() && pos == count - 1)
return true;
}
return false;
}
}
당신은 이것을 할 수 있습니다 그것은 나를 위해 일합니다
mRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ?
0 : recyclerView.getChildAt(0).getTop();
LinearLayoutManager linearLayoutManager1 = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstVisibleItem = linearLayoutManager1.findFirstVisibleItemPosition();
swipeRefreshLayout.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0);
}
});
OnTouchListener로 시도 할 수 있습니다.
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_UP
|| e.getAction() == MotionEvent.ACTION_MOVE){
if (mLinearLayoutManager.findFirstCompletelyVisibleItemPosition() > 0)
{
// beginning of the recycler
}
if (mLinearLayoutManager.findLastCompletelyVisibleItemPosition()+1 < recyclerView.getAdapter().getItemCount())
{
// end of the recycler
}
}
return false;
}
RecyclerView가 아래로 스크롤되었는지 확인하려면 스크롤바에 사용 된 메서드를 재사용 할 수 있습니다.
편의상 Kotlin 확장 함수로 작성된 계산입니다.
fun RecyclerView.isScrolledToBottom(): Boolean {
val contentHeight = height - (paddingTop + paddingBottom)
return computeVerticalScrollRange() == computeVerticalScrollOffset() + contentHeight
}
'programing' 카테고리의 다른 글
Perl에서 밀리 초 동안 어떻게 잠을 자나요? (0) | 2020.10.26 |
---|---|
Web.Config의 전자 메일 표시 이름에서 Smtp 저장 (0) | 2020.10.26 |
경로에서 파일 이름 가져 오기 (0) | 2020.10.25 |
jQuery에서 getJSON에 대해 캐시를 false로 설정하는 방법은 무엇입니까? (0) | 2020.10.25 |
문자열을 열거 형으로 캐스팅 (0) | 2020.10.25 |