이 영역을 누르면 첫 페이지로 이동
CodeJUN 블로그의 첫 페이지로 이동

CodeJUN

페이지 맨 위로 올라가기

CodeJUN

심심해서 하는 블로그

RecyclerView에서 원하는 항목 item 제거하기

  • 2018.07.17 11:03
  • Android

사건의 발단

외주를 하면서 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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 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
다른 글 더 둘러보기

정보

CodeJUN 블로그의 첫 페이지로 이동

CodeJUN

  • CodeJUN의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 방명록

카테고리

  • 분류 전체보기 (54)
    • Android (38)
    • BlockChain (4)
    • React Native (4)
    • 아두이노 (2)
    • 프로젝트 (6)

공지사항

  • 공지 - 블로그를 시작하며

태그

  • Android
  • 아두이노
  • 안드로이드
  • c++
  • arduino
  • C
  • Firebase
  • 강좌

나의 외부 링크

  • Github

정보

CODE_JUN의 CodeJUN

CodeJUN

CODE_JUN

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © CODE_JUN. Designed by Fraccino.

티스토리툴바