본문 바로가기
Developer/Android, Java

[안드로이드] recyclerView에서 Activity로 인텐트 값 넘기기

by Doony 2019. 5. 21.

이번 포스팅에서는 recyclerView Adapter에서 새로운 액티비티를 실행시킬 때, 그 결과값을 받기 위한 방법에 대해 알아보겠습니다.
먼저 액티비티와 recyclerView의 구성은 다음과 같습니다.

  • MainActivity
    • MainFragment
      • RecyclerView
        • Button
          • (onClick 시) NewActivity

다소 복잡해보이지만 아주 일반적인 구성입니다. 액티비티 위에 프래그먼트가 있고, 그 프래그먼트 안에 recyclerView를 활용하여 리스트를 띄웁니다. 각각의 리스트 안에 특정 버튼을 눌렀을 때, 새로운 액티비티를 실행하고, 액티비티가 특정 조건에서 finish될 때(ex. 해당 리스트 삭제) 그 조건 값을 MainFragment에서 인식하여 refresh하는 방식입니다.

복잡래보여도 천천히 읽어보면 무슨 말인지 이해가 가지 않겠군요.. 쉽게 예시를 들자면 통상 앱에서 볼 수 있는 다음 기능입니다.

상황) 맛집앱에서 리뷰를 작성하여 내 리뷰가 떠있었음.
그 상태에서 내가 작성한 리뷰를 삭제함.
그럼 리뷰가 삭제됨(finish)과 동시에 맛집 정보가 refresh되고, 내가 쓴 리뷰는 더이상 보이지 않음.

액티비티와 프래그먼트를 연결하는 작업 등에 대해서는 다루지 않고, 핵심적인 부분들만 간단히 다뤄보겠습니다.
일반적으로 RecyclerViewAdapter에서 새로운 액티비티를 생성하기 위한 인텐트는 다음과 같습니다.

Intent intent = new Intent(context, NewActivity.class);
startActivity(intent);
cs

이렇게 되면 `NewActivity`가 `finish`되었을 때 리턴값을 받을 수 없기 때문에, `startActivityForResult` 를 사용해야합니다. 그러나 RecyclerView자체에서는 Result를 받을 수 없기 때문에, 프래그먼트를 끌어와서 받게 되는데요. 프래그먼트에서는 자신이 깔려있는 메인 액티비티를 또 끌어와서 받을 수 있습니다. 아래와 같이 말이죠.

Intent intent = new Intent(context, NewActivity.class);
((Activity) context).startActivityForResult(intent, RESULT_CODE);
cs

여기서 context는 RecyclerView 어댑터를 생성할 때 끌어온 프래그먼트입니다. 해당 컨텍스에 Activity를 앞에 붙이면, 액티비티를 끌어오게 되는 셈입니다. 따라서 신규 액티비티에서 특정 조건에서 finish했을 때, 그 값을 MainActivty에서 받아 각각 처리를 할 수 있습니다.

(한가지 설명을 더하자면, NewActivity가 finish되면, MainActivity가 먼저 Resume되고, 그 후에 MainFragment가 Resume됩니다. 때문에 OnResume함수를 Override하면 원하는 형태로 코드를 구성할 수 있습니다.)

댓글