개발모음집

RecyclerView Paging 본문

Android

RecyclerView Paging

void 2017. 8. 8. 13:18

페이징 소스를 찾다가 내가 리사이클러뷰를 구현한 방법과 이 예제가 리사이클러뷰를 구현한 방법이 비슷하여 이 예제로 페이징하기로 했다.

페이징은 성공, 다만 페이징이후 아이템을 클릭했을 때 

java.lang.IndexOutOfBoundsException: Invalid index 16, size is 15


위와 같은 에러를 낸다.

리스트 사이즈를 더하지 않아서 문제인 것 같다. 소스를 찾아보자

 

 @Override
public void onLoadMore() { // 새로 로드
Log.d("MainActivity_", "onLoadMore");
mAdapter.setProgressMore(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
itemList.clear();
mAdapter.setProgressMore(false);
start = mAdapter.getItemCount();
// end = start + 15;
getData(start, 15, naviBoardNo);
mAdapter.addItemMore(itemList);
mAdapter.setMoreLoading(false);

// Log.e("개수 확인", start + ", " + end);
}
}, 2000);
}

나는 itemList라는 ArrayList를 클리어해준다.

그 이유를 예를 들어 설명하자면, 20개의 글이 있고 5개씩 페이징을 한다고 가정했을 때

20번부터 16번까지 처음에 나오고 loadMore시 15번부터 11번까지, 또 하면 10번부터 6번까지, 5번부터 1번까지..

이런 식으로 로드해오는데 어레이리스트를 클리어해주지않으면, 15번부터 11번까지 나올 타이밍에

20번부터 11번까지 이어서 나온다.

 

어댑터에 데이터 갱신할 때 notifyItemRangeChanged만 있는 줄 알았는데 참고블로그를 보니 여러가지 종류가 있다.


notifyItemRangeInserted(itemList.size(), 15);

notifyItemRangeInserted를 사용하여 특정 범위에 추가하는 방식으로 하였다.

 

public void addItemMore(List<CommuItem> list) {
Log.e("listsize", list.size() + "");

for (int i = list.size() - 15; i < list.size(); i++) { // arrayList가 FIFO구조라서 index가 뒷 쪽인걸 가져와야함

itemList.add(list.get(i));
}
Log.e("listsize", list.size() + "");
notifyItemRangeInserted(itemList.size(), 15); // http://gogorchg.tistory.com/entry/Android-RecyclerView-Adpater-Refresh, (positionStart, count)

}