본문 바로가기
개발 관련 이야기

RecyclerView.Adapter 사용 시 앱 기본테마가 적용 안되는 문제

by 꿈틀쓰 2022. 9. 14.

회사에서 급하게 안드로이드 프로젝트에 투입되었는데, 외주로 오신 분이 주신 리사이클러뷰를 사용한 비디오 슬라이딩 뷰 작업 하신거에 버튼을 추가할 일이 생겼다.

 

그런데 엥? 버튼의 테마가 안드로이드 스튜디오의 Design뷰에서는 잘 나오는데 실제로 실행하니 기본 안드로이드 테마가 아니라 아주 예전에 쓰던 회색 바탕의 못생긴 버튼이 출력되었다.

 

 

 

위 영상을 보면 BUTTON IN MAIN 버튼은 VideoPage2 바깥, 즉 리사이클러 뷰 바깥에 메인엑티비티 쪽에서 생성한 것이다. 테마가 잘 적용되었다.

 

그런데 Page 로 시작하는 버튼들은 리사이클러뷰 안에 있는 버튼이고 내가 아무 스타일도 주지 않았으니 같은 테마여야 하는데 저렇게 나왔다.

 

구글에 정말 모든 가능한 키워드 조합으로 검색해봐도 저런 경우가 없어 아 그냥 시간도 없는데 이미지를 입혀버릴까 생각했지만 우선 할 수 있는데까지는 해보기로 했다.

 

 

 

집에 와서까지 붙들고 늘어지다가.... 결국 해결했다.

(역시 진심을 다 하면 되는것인가)

 

 

그건 바로 RecyclerView.Adapter를 상속받는 커스텀어댑터 클래스에서 onCreateViewHolder 메소드에서 LayoutInflater.from(context) 이 놈이었다.

 

 

public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewHolderPage> {

    private ArrayList<DataPage> listData;
    private final Context mContext;

    ViewPagerAdapter(ArrayList<DataPage> data, Context context) {
        this.listData = data;
        this.mContext = context;
    }

    @Override
    public ViewHolderPage onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_viewpager, parent, false);
        return new ViewHolderPage(view);
    }
    
    ...
  }

 

그 외주하시는 분께서 동영상 작업 때문에 생성자에서 context를 받으셨는데, 이를 inflate하는데 사용하셨다. 그런데 다른 리사이클러뷰를 활용하는 코드에는 모두 아규먼트의 parent.getContext()from의 파라미터로 넘겨주길래 이부분을 바꿔봤더니 정상적으로 테마가 적용되었다... 

 

 

정말 못할 줄 알았는데 집에서 소리질렀다.

 

public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewHolderPage> {

    private ArrayList<DataPage> listData;
    private final Context mContext;

    ViewPagerAdapter(ArrayList<DataPage> data, Context context) {
        this.listData = data;
        this.mContext = context;
    }


    @Override
    public ViewHolderPage onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.item_viewpager, parent, false);
        return new ViewHolderPage(view);
    }
    
    ...
  }

위는 정상작동 코드이다.

 

 

 

 

 

 

 

 

솔직히 이유는 정확히 모르겠다.

 

하지만 추측컨데 parent에서 getContext로 얻은 콘텍스트는 parent Activity에서 온 것이고 필드 값으로 저장한 콘텍스트는 생성시 getActivity().getApplicationContext()로 얻은 어플리케이션 콘텍스트라서 UI 관련한 정보가 없어서 그랬던게 아닐까 생각해본다.

댓글