RecyclerView의 아이템리스트를 삭제를 하려고 했는데 getAdapterPostition의 값이 -1이여서 발생한 오류
먼저 이 문제에서 가장 헷갈리게 했던 원인은 아이템뷰를 클릭했을 시에는 아이템의 위치를 알고 데이터를 가지고 오는데 삭제를 눌렀을 시에는 위치를 인식을 못해서 골치가 아팠다.
임시방편으로 getAdapterPostition가 null인 경우에는 return을 줘서 앱이 터지지는 않도록 만들어놓고 삭제를 버튼을 계속 눌렀는데 시간이 지나서 앱이 터지지 않고 데이터가 삭제 됐다.
그래서 getAdapterPostition() 를 getLayoutPosition() 로 바꿨더니 앱이 터지지 않고 삭제가 되었지만 삭제된 데이터가 View에 적용되는데 시간이 조금 걸렸다.
어쨋든 저렇게 수정했을 때 AdapterPosition을 가지고온다는 것은 Adapter가 계산되는 것이 느리다고 추론을 하였다. 그래서 찾다 보니 페이징처리를 하는 부분에서 비동기로 데이터를 가지고온 후
변동된 데이터 값의 아이템위치를 수정을 안해줘서 -1이 발생했던 것이였다.
그래서 비동기 콜백으로 받아오는 함수 안으로 adapter.setResultView() 함수를 넣어서 해결했다.
문제의 코드)
scrollListener = new PagingScrollListener(linearLayoutManager) {
@Override
public void LoadMore(int page, int ItemsCount, RecyclerView view) {
if (!ShouldLoadMore) {
return;
}
networkRenewalLoadList.fetch(requireContext(), true, Text, mStartNum, cStartNum, list -> {
pagination(list, Mode, adapter);
});
adapter.setResultView(isMobileMode, mStartNum, cStartNum);
}
};
수정 후
scrollListener = new PagingScrollListener(linearLayoutManager) {
@Override
public void LoadMore(int page, int ItemsCount, RecyclerView view) {
if (!ShouldLoadMore) {
return;
}
networkRenewalLoadList.fetch(requireContext(), true, Text, mStartNum, cStartNum, list -> {
pagination(list, Mode, adapter);
adapter.setResultView(isMobileMode, mStartNum, cStartNum);
});
}
};
도움이 되는 글이였으면 좋겠습니다.
그리고 틀린 내용이 있으면 피트백 부탁드리겠습니다!