RecyclerView에서 원하는 항목 item 제거하기
사건의 발단
외주를 하면서 Youtube의 재생목록을 파싱하던 중 Playlist도 같이 파싱이 되어서 리스트 결과에 영상을 확인할 수 있는 VideoID가 null값으로 리턴되는 것을 확인하였다.
이는 클릭 후 VideoID를 넘겨 영상을 재생하는 기능에서 파라미터 문제가 생겼고, 재생에 문제가 생기게 된다.
생각한 해결 방안
파싱이 끝나면 지정한 ArrayList에서 지정 Data Class로 넘길 때 getVideoID에서 값이 null인 것만 .remove(position)으로 제거해줄 생각이었다.
그런데 이렇게 되면 각 position값 들이 하나씩 밀리게 되며 추후 관리에도 귀찮아질 것 같아서(...) 안 했는데 시도해 봐도 결과는 강제종료..
구글링?
각종 키워드로 구글링을 시도하였다. recyclerview item delete... how to delete item in recyclerview... 스택오버플로우를 시작으로 온갖 사이트를 돌아다녔는데 해결방안은 없었다..
그러던 중 국내 한 블로그를 발견하게 되었다.
나의 잘못
나는 recyclerview가 스크롤 하면서 데이터를 받아올 때 getVideoID가 null이면 아이템을 제거하는 소스코드를 짰었다. 등잔밑이 어둡다고.. 에러 로그에 보니 아래와 같이 뜬다.
Cannot call this method while RecyclerView is computing a layout or scrolling
... 리사이클러 뷰가 스크롤 중일 땐 사용불가하다는 의미인듯 하다. 이러니까 아무리 notify를 해도 듣지를 않지!
해결방안
아래 블로그 주소를 그냥 적어두겠다. 설명도 잘 되어있고, 누구나 원하는 방법일 것이다.
제가 블로그를 보고 작성한 코드입니다.
if (currentVideo.getVideoId() == null) {
Handler handler = new Handler();
final Runnable r = () -> {
int position1 = viewHolder.getAdapterPosition();
try {
videos.remove(position1);
notifyItemRemoved(position1);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
};
handler.post(r);
}
먼저 videoID가 null일때를 구분하고, 해당 부분의 position값을 구합니다. viewHolder.getAdapterPosition();으로 구하시면 되겠습니다.
그 다음 notifyItemRemoved(position);으로 아이템이 제거 되었다는 것을 온 동네에 알립시다.
마지막으로 post로 handler를 호출해 위 기능들을 실행합니다.
참고로 본인은 위 블로그의 방법대로 해결을 보았습니다. 혹시라도 다른 방법으로 해결을 하시게 된다면, 저나 저 블로그 주인분께도 알려주시면 정말 좋은 정보가 될 것 같습니다.
질문은 댓글로!
'Android' 카테고리의 다른 글
BottomNavigationView 애니메이션 제거하기 (0) | 2018.07.22 |
---|---|
Magellan(마젤란) 사용하기 (0) | 2018.07.19 |
Google I/O Extended Seoul 참가 후기 (0) | 2018.06.12 |
Android Studio에서 Firebase Assistant 사용하기 (With. Dynamic Links) (2) | 2018.06.03 |
ML Kit 을 사용하여 간편하게 머신러닝 사용하기 (1) | 2018.05.25 |
댓글
이 글 공유하기
다른 글
-
BottomNavigationView 애니메이션 제거하기
BottomNavigationView 애니메이션 제거하기
2018.07.22 -
Magellan(마젤란) 사용하기
Magellan(마젤란) 사용하기
2018.07.19 -
Google I/O Extended Seoul 참가 후기
Google I/O Extended Seoul 참가 후기
2018.06.12 -
Android Studio에서 Firebase Assistant 사용하기 (With. Dynamic Links)
Android Studio에서 Firebase Assistant 사용하기 (With. Dynamic Links)
2018.06.03