scrollToPosition
RecyclerView를 사용하면서 어떤 사용자 action 등에 의해 특정 아이템 위치로 스크롤할 필요가 있다.
이때 손쉽게 사용할 수 있는 방법으로 기본적으로 제공되는 scrollToPosition 함수를 사용한다.
// #1.
RecyclerView.scrollToPosition(position: Int)
// #2
RecyclerView.smoothScrollToPosition(position: Int)
위 함수를 통해 스크롤을 하게 되면 해당 아이템이 보이는 위치까지만 스크롤
다시 말해 내가 찾고자 하는 아이템을 최상단에 보여주도록 스크롤을 해주지 않는다는 의미
내가 이동하고자 하는 아이템을 최상단이나 최하단으로 위치시키면서 스크롤하기 위해서는 아래와 같이 사용해야 한다.
Kotiln
val smoothScroller: SmoothScroller by lazy {
object : LinearSmoothScroller(context) {
override fun getVerticalSnapPreference() = SNAP_TO_START
}
}
smoothScroller.targetPosition = position
recyclerView.layoutManager?.startSmoothScroll(smoothScroller)
Java
RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(binding.keypadRecycler.getContext()) {
@Override protected int getVerticalSnapPreference() {
return LinearSmoothScroller.SNAP_TO_START;
}
};
smoothScroller.setTargetPosition( itemPosition ); //itemPosition - 이동시키고자 하는 Item의 Position
recycler.getLayoutManager().startSmoothScroll(smoothScroller);
return 단자 의미
getVerticalSnapPreference() 수직 기준
getHorizontalSnapPreference() 수평 기준
- SNAP_TO_START - 자식 뷰의 왼쪽 또는 위쪽을 부모 뷰의 왼쪽 또는 위쪽에 정렬
- SNAP_TO_END - 자식 뷰의 오른쪽 또는 아래쪽을 부모 뷰의 오른쪽 또는 아래쪽에 정렬
- SNAP_TO_ANY - 현재 부모와 관련된 위치에 따라 자식을 시작 또는 끝에서 스냅 할지 여부를 결정
scrollToPositionWithOffset
또한 offSet 값으로 원하는 수치만큼 스크롤할 때는 scrollToPositionWithOffset()을 사용한다.
start 지점으로 부터 offset 만큼 떨어진 위치로
position 번째 아이템을 스크롤
Kotlin
val layoutManager = LinearLayoutManager(requireContext())
recyclerView.layoutManager = layoutManager
val centerOfScreen = recyclerView.width / 2
layoutManager.scrollToPositionWithOffset( itemPosition , centerOfScreen) //itemPosition - 이동시키고자 하는 item Position
Java
LinearLayoutManager layoutManager = new LinearLayoutManager(requireContext());
recyclerView.setLayoutManager(layoutManager);
int centerOfScreen = recyclerView.getWidth() / 2;
layoutManager.scrollToPositionWithOffset(lastReadPosition, centerOfScreen); //itemPosition - 이동시키고자 하는 item Position
이렇게 RecyclerView의 폭의 절반 값을 주어 아이템이 RecyclerView의 중앙에 오도록 구현할 수도 있다.
최상단에 오게 하려면 0을 줘도 된다.
Scroll Position 복구
Kotiln
private var recyclerViewState: Parcelable? = null
// onResume() 에서 저장해둔 리사이클러뷰 상태를 다시 set
override fun onResume() {
super.onResume()
if (recyclerViewState != null) {
setSavedRecyclerViewState()
}
}
// 저장해야 될 시점에 호출
fun saveRecyclerViewState() {
// LayoutManager를 불러와 Parcelable 변수에 리사이클러뷰 상태를 Bundle 형태로 저장한다
recyclerViewState = recycler.layoutManager?.onSaveInstanceState()
}
fun setSavedRecyclerViewState() {
recyclerView.layoutManager?.onRestoreInstanceState(recyclerViewState)
}
Java
private Parcelable recyclerViewState = null;
// onResume() 에서 저장해둔 리사이클러뷰 상태를 다시 set
@Override
public void onResume() {
super.onResume();
if (recyclerViewState != null){
setSavedRecyclerViewState();
}
}
// 저장해야 될 시점에 호출
void saveRecyclerViewState(){
// LayoutManager를 불러와 Parcelable 변수에 리사이클러뷰 상태를 Bundle 형태로 저장한다
if (recycler.getLayoutManager() != null)
recyclerViewState = recycler.getLayoutManager().onSaveInstanceState();
}
void setSavedRecyclerViewState(){
// LayoutManager를 불러와 Parcelable 변수에 리사이클러뷰 상태를 Bundle 형태로 저장한다
if (recycler.getLayoutManager() != null)
recycler.getLayoutManager().onRestoreInstanceState(recyclerViewState);
}
'Android > Reference' 카테고리의 다른 글
ScrollListener (스크롤 리스너) (0) | 2020.10.28 |
---|---|
Selector xml (0) | 2020.10.28 |
Multi View Type RecyclerView (0) | 2020.10.28 |
RecyclerView Click Event (0) | 2020.10.28 |
xml에서 opacity(투명도) 넣기 (0) | 2020.10.28 |