티스토리 뷰



현상



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 초기화 함수는 없을까..




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함