본문 바로가기
Android 개발/android :: Tip

[안드로이드 RecyclerView] 구분선 제거하는 방법 (divider 없애기)

by 독학하는 1인 개발자 2021. 1. 14.

Android 개발 Tip.

 

- RecyclerView

 

구분선 제거 하는 방법.

 

How to remove RecyclerView Divider

 

 

 

 

안드로이드 RecyclerView는 참 성의 없게 만들었나 싶을 정도로 이상한 게 많고 복잡하다.

 

아니 도대체 왜 정석적인 방식 그대로 만들었는데 나만 이상하게 나오는 게 많을까?

 

그냥 구분선이 유지되면 차라리 나은데

 

리스트를 추가하니까 구분선이 굵어지거나 진해지거나 height가 늘어난다.

 

아니 도대체 왜 그러는건데.

 

 

안드로이드 좀 한다는 지인에게 보여줘도 해결이 안 된다.

 

아니 왜 니꺼만 그러냐? 하고 다른 코드를 다 찬찬히 봐도 별다른 이상이 없다.

 

도대체 무슨 문제일까?

 

그래서 구분선을 없애는 극단적인 방법을 택했다.

 

 

리사이클러뷰의 구분선을 없애기 위해서

 

구글링을 해봤더니

 

RecyclerView 구분선 만들기는 넘쳐나는데

 

반대로 RecyclerView 구분선 제거 방법은 거의 나오지 않는다.

 

리사이클러뷰 구분선을 제거하고 싶은 사람이 생각보다 없나보다.

 

 

ListView도 아닌데 android:divider 값을 조절하라는 말도 안 되는 코멘트도 많았다.

 

스택오버플로우에서 알려준 다음 코드는 먹히지 않았다.

 

1
recycle.addItemDecoration(new DividerItemDecoration(context, 0));
cs

 

 

또 어떤 외국사이트에서 알려준 다음 코드도 먹히지 않았다.

 

1
2
3
4
5
6
mRecyclerView.addItemDecoration(new DividerItemDecoration(mContext, LinearLayoutManager.VERTICAL) {
    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        // Do not draw the divider
    }
});
cs

 

 

 

 

 

마지막으로 완벽하게 먹힌 코드다.

 

 

 

1. DividerItemDecoration 클래스를 만들어 RecyclerView.ItemDecoration을 상속해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DividerItemDecorator extends RecyclerView.ItemDecoration {
    private Drawable mDivider;
    public DividerItemDecorator(Drawable divider) { mDivider = divider; }
 
    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        int dividerLeft = parent.getPaddingLeft();
        int dividerRight = parent.getWidth() - parent.getPaddingRight();
        int childCount = parent.getChildCount();
        for(int i=0;i<=childCount-2; i++){
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)child.getLayoutParams();
            int dividerTop = child.getBottom()+params.bottomMargin;
            int dividerBottom = dividerTop+mDivider.getIntrinsicHeight();
            mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
            mDivider.draw(canvas);
        }
    }
}
cs

 

 

 

2. 투명한 배경의 xml 파일을 하나 만들어준다. 

 

[drawable] - divider.xml

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="1dp"
        android:height="1dp" />
    <solid android:color="@android:color/transparent" />
</shape>
cs

 

 

 

3. 내 RecyclerView에 붙여준다.

 

기존 addItemDecoration을 없애고

새로 만든 클래스로 .addItemDecoration을 해준다.

 

1
2
3
4
5
6
RecyclerView rcView = findViewById(R.id.mRcView);
rcView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
 
//rcView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(this, R.drawable.divider));
rcView.addItemDecoration(dividerItemDecoration);
cs

 

 

 

코드도 길어지고 할 것도 뭔가 많지만

 

그래도 완벽하게 해결한 방법이었다.

 

 

 

 

구글 보면 요새 참 일 못한다.

 

마이크로소프트를 보면 호환성과 업데이트에 참 많이 신경 쓰는데

 

구글은 대충 만든 것도 많고 답 안 나오면 그냥 deprecated 시키고

 

뭐 개발자 입장에서는 아이고 고맙습니다 하면서 써야 하지만

 

바라는 게 많아지는 건 어쩔 수 없나보다.

 

 

 

 

 

 

댓글