마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

음.. 자바 문법 문제인지 어댑터에 대한 문제인지 질문좀드립니다

0 추천
part.setOnClickListener(new View.OnClickListener() {
                int pos = getAdapterPosition();
                @Override
                public void onClick(View v) {
                    if(select == false) {
                        part.setBackgroundColor(context.getResources().getColor(R.color.teal_700));;
                        select = true;
                    }
                    else {
                        part.setBackgroundColor(context.getResources().getColor(R.color.white));;
                        select = false;
                    }
                    listener.OnItemClick(v, position);
                }
            });

 

Fragment.java

adapter.setOnItemClickListener(new DialogItemAdapter.OnDialogItemClickListener() {
            @Override
            public void OnItemClick(View v, int pos) {
                String data = adapter.getItem(pos).getPart();
            }
        });

리사이클러뷰 어댑터내에서 텍스트뷰에대한 클릭이벤트를 작성했는데요,

getAdapterPosition을 이용하여 현재 아이템에 대한 클릭이벤트를 작성합니다. (이벤트 기능에대한 구현은 외부에서 합니다)

그런데 해당위치에서 getAdapterPosition()을 사용하니 listener.Onitem(v, position)에서 호출시에러가나네요..값이 -1로 들어갑니다.. 정확히는 어댑터가 아니라 아래 코드 프래그먼트 코드의 getItem하는 부분에서 

에러가나네요. 이 말은 즉 앞의 얻은 position 값은 없어지고 쓰레기값이 들어간것같은데요..

어댑터의 OnClick 함수내에서 getAdapterPosition을 하면 정상적으로 작동이 됩니다. 

이유가 뭔가요?

 익명객체라도 안에서 필드를 선언할수있는걸로 아는데 왜 값이 제대로 안들어 가는지 모르겠어요.

혹시 OnClick 내에서만 호출해야지만 제 값을 알 수있나요?

 

+++++++++++++++++++++++++++++++++++++++++++++

        dialogAdapter.setOnItemClickListener(new DialogItemAdapter.OnDialogItemClickListener() {
            @Override
            public void OnItemClick(View itemView, int pos) {
                Log.d(TAG, "OnItemClick: ");
                String data = dialogAdapter.getItem(pos).getPart();
            }
        });

 

codeslave (3,940 포인트) 님이 2020년 12월 27일 질문
codeslave님이 2020년 12월 27일 수정

3개의 답변

0 추천

ViewHolder에서 

int pos = getAdapterPosition();

하신 다음에, 

String data = listener.onItemClick(v, position);

을 호출하고 계신데, position은 어디에서 오는 건가요? position이 다른 변수라면 당연히 문제가 될 것 같구요, pos를 잘못 적으신 거라면, 문법 상으로는 문제가 없어 보이는데.

ViewHolder API를 찾아보시면 이렇게 나옵니다.
https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder

getAdapterPosition()

This method is deprecated. This method is confusing when adapters nest other adapters. If you are calling this in the context of an Adapter, you probably want to call getBindingAdapterPosition() or if you want the position as RecyclerView sees it, you should call getAbsoluteAdapterPosition().

getAdapterPosition은 deprecated 되었네요. 내부에 다른 어댑터와 같이 쓸 때는 문제가 되기 때문에, getBindingAdapterPosition을 사용하거나, RecyclerView로부터 시작하는 위치를 구하려면, getAbsoluteAdapterPosition을 사용하는 것이 더 정학할 것 같네요..

님현재 리사이클러뷰의 아이템 레이아웃이 어떻게 구성되어 있느냐에 따라 적절한 메소드를 사용해야 할 것 같습니다. pos와 position의 문제가 아니라면, getBindingAdapterPosition이나 getAbsoluteAdapterPosition으로 바꿔서 다시 해보세요.

spark (224,800 포인트) 님이 2020년 12월 27일 답변
흠..이상하네요 pos를 오타낸것같아 position으로 고치고했는데 그래도 에러가나네요.. int pos = getAdapterPosition(); 를 OnClick 내부(if문 바로위)에 넣으면
이상하게 실행이됩니다..뭐가 제가 모르는 다른 문제가 있는걸까요
0 추천
part.setOnClickListener(new View.OnClickListener() {
                int pos = getAdapterPosition();
                @Override
                public void onClick(View v) {
                   
                }
            });

님의 말씀처럼, getAdapterPosition을 호출하는 위치가 잘못된 것 같네요. 위처럼 하게 되면,View.OnclickListener가 생성될 때
int post = getAdapterPosition()도 같이 초기화 됩니다. 따라서 실제로 클릭을 할 때와는 다른 위치가 될 수 있습니다.

part.setOnClickListener(new View.OnClickListener() {
                
                @Override
                public void onClick(View v) {
                   int pos = getAdapterPosition();
                }
            });

이렇게 하면 실제 클릭이 되어질 때 getAdapterPosition을 호출하므로, 원하시는 결과값이 나오는 겁니다.

spark (224,800 포인트) 님이 2020년 12월 27일 답변
아 그렇군요 감사합니다!
0 추천
getAdapterPosition() 을 사용하실 때는 반드시 RecyclerView.NO_POSITION 이 아닌지 체크하시고 사용하셔야 해요. 리사이클러 뷰가 갱신되는 중에 getAdapterPosition() 을 호출하면 RecyclerView.NO_POSITION( = -1) 을 리턴하게 됩니다.
지식백곰 님이 2021년 2월 22일 답변
감사합니다 바로 수정했습니다
...