티스토리 뷰
현상
GridLayoutManager 를 이용한, Recycler View 로
Custom Calendar 를 작성하다가 발생한 문제...
그림을 먼저 보자
그림처럼, 달력을 넘기고, Recycler View 를 달력기준으로 다시 그릴때마다 하단의 간격이 조금씩 넓어졌다.
아래와 같은 사이클이었다.
1. RecyclerViewAdapter 생성
2. Vertical Decorator 설정
3. GridLayout Manager 설정
4. Recycler View 에 setAdapter()
특정 버튼을 누르면 위 사이클이 반복되도록 프로그램을 구성했었다.
그러나, 버튼을 누를때마다 Recycler View 가 다시 그려지면서,
각 행이 점점 벌어짐
옘병 이게 무슨일..?
디버깅
우선, 문제가 뭔지 생각해보자.
아래가 Recycler View 를 그리는 코드이다.
Adapter a = new Adapter(....);
recyclerView.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL));
recyclerView.setLayoutManager(new GridLayoutManager(...));
recyclerView.setAdapter(a);
아무래도 가로 행이 갱신할때마다 늘어나는 것으로 보아 Vertical Decoration 이 문제가 아닐까 싶다.
addItemDecoration()... 함수를 디버깅해보자
위 그림처럼 디버깅을 돌려보면..
데코레이션이 Recycler View 에 잘 추가된다.
근데..여기서 Recycler View 를 다시한번 그려주면,
위 그림 처럼 데코레이션이 교체 되는게 아니라 그림처럼 추가될 것이다.
왜 ?
그렇다면, 왜 이런 현상이 벌어질까?
Recycler View 의 Decoration 변수를 한번 보자.
support.v7 library 에 RecyclerView.java 안에 Decoration 은 아래와 같이 선언되어있다.
final ArrayList<ItemDecoration> mItemDecorations = new ArrayList<>();
그리고, 데코레이션을 추가하는 부분을 보자
mItemDecorations.add(decor);
위 코드에서 보는것처럼, ArrayList 에 데코레이션 객체를 추가하는 것이다.
따라서, 데코레이션이 계속 추가될 것이고,
나의 코드대로라면, Recycler View 를 다시 그릴때마다
1dp 짜리 Decoration 이 계속 추가될 것이다.
해결을 위한 시도
RecyclerView 를 다시 그릴때, 멤버변수인 Decoration 이 계속 쌓이니까..
RecyclerView 객체 자체를 다시 할당하면 되지 않을까?
다시 그리기 전에 아래와 같은 코드를 삽입했다.
recyclerView = null;
recyclerView = (RecyclerView) findViewById(...);
여기서 내가 기대한 동작은,
Recycler View 가 초기화 되면서, mItemDecorations ArrayList 도 초기화 되는것.
하지만, 초기화 되지 않았다.
findViewById 를 하면 다시 기존의 정보들을 복구했고, 다른방법이 필요했다.
해결
Decoration 을 add 하기전에,
기존의 Decoration Array 에서 Deco 를 꺼내 remove() 하였다.
아래와 같은 프로세스로 흘러간다.
DividerItemDecoration deco;
private void resetRecyclerView() {
// init adapter
if(deco != null)
recyclerView.removeItemDecoration(deco);
deco = new DividerItemDecoration(..);
recyclerView.addItemDecoration();
// ......
}
위 로직을 적용하여 decoration 이 중복 세팅되는걸 막았다.
더 좋은 방법이 있을것같으나 우선 이렇게 해결.....
Recycler View Decoration 초기화 함수는 없을까..
'Computer > Android&iOS' 카테고리의 다른 글
(Android) RecyclerView wrap_contents (0) | 2018.11.07 |
---|---|
(Android) Recycler View 선택된 항목 변경 성능 이슈 (1) | 2018.11.07 |
(Android) failed to instantiate one or more classes .. (0) | 2018.10.23 |
(Android) PNG 투명영역 미터치 처리 (0) | 2018.10.15 |
(Android) binary xml file line #0 error inflating class (0) | 2018.10.05 |
- Total
- Today
- Yesterday
- 뉴스룸
- xcode
- C
- 배열
- GIT
- Asterisk
- linux
- 서버
- Phaser
- IOS
- 앵커브리핑
- 깃헙
- C언어
- Node
- 안드로이드
- node.js
- nodejs
- 스위프트
- mysql
- BBC 가쉽
- Android
- 리눅스
- 손석희
- Swift
- 노드
- CentOS
- Kotlin
- 점유율
- php
- git hub
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |