안드로이드 어댑터에서 프로그먼트나 액티비티 함수 사용하는 법

프로그래밍/Android 관련2018. 2. 28. 01:31

안녕하세요. 개발자 드리머즈입니다.


이번 포스팅에서는 RecyclerView 사용시 겪게되는 Adapter에서 Activity나 Fragment에 접근 문제에 대해 알아보겠습니다.


문제상황

RecyclerView 사용시 RecyclerView.Adapter(이하 Adapter) 클래스를 상속받아 정의함으로써 표현하고자 하는 데이터를 리싸이클러뷰에 어떻게 표현할 지 설정할 수 있습니다. 예를들어 아래 그림과 같이 RecyclerView가 만들어졌다고 가정하겠습니다. +버튼과 -버튼을 눌러 주문하고자 하는 과일의 수량을 정하는 어플입니다. 


개발자 입장에서 RecyclerView는 껍데기일 뿐이며 RecyclerView와 관련된 코드들은 대부분 Adapter에 위치하게 됩니다. 그래서 사용자가 +버튼이나 -버튼을 눌러 특정 과일의 갯수를 조절한다면 이 부분을 처리하는 코드는 Adapter에 존재합니다. 그런데 이렇게 Adapter에서 처리된 데이터(특정 과일의 갯수 등)들은 결국 Adapter에서 이 RecyclerView를 만든 Activity나 Fragment로 전달되어야 합니다. 이를 위해 Adapter에서 Activity나 Fragment에 접근이 가능해야 합니다. Adapter에서 Activity나 Fragment의 변수나 함수를 사용할 수 있어야 한다는 말입니다.

Fragment를 사용할 때는 getActivity() 함수를 통해 Activity에 쉽게 접근할 수 있습니다. 하지만 Adapter에서는 기본적으로 Activity나 Fragment에 접근할 수 있는 방법이 제공되지 않습니다. 




해결방법

그래서 Adapter에서 Activity나 Fragment에 접근하는 방법이 무엇인지 어떤 방석이 정석인지 찾아봤습니다.


https://stackoverflow.com/questions/35008860/how-to-pass-values-from-recycleadapter-to-mainactivity-or-other-activities


위의 스택오버플로우에 나와있는 답안이 정석이라고 불릴만한 방법인 것 같습니다.

여기서 간단하게 그 방법을 보겠습니다.


먼저 OnItemClick이라는 interface를 정의합니다. 이 인터페이스의 내부에 onItemClick이라는 함수의 프로토타입을 정의합니다.  


OnItemClick.java

1
2
3
public interface OnItemClick {
    void onClick (String value);
}
cs

Adapter에서 접근하고자 하는 대상이 되는 Activity(혹은 Fragment)가 OnItemClick을 상속(implements)받도록 수정합니다.
OnItemClick을 implements하면 onClick 함수를 override해야 합니다. 이 onClick함수는 Adapter에서 호출할 수 있는 함수가 될 것입니다.
그리고 Adapter 생성자의 마지막 인자를 주목해주세요. 여기서 this 인자는 OnItemClick의 객체를 의미합니다.

MainActivity.java
1
2
3
4
5
6
7
8
9
public class MainActivity extends AppCompatActivity implements OnItemClick {
    recycleAdapter = new RecycleAdapter(MainActivity.this,onlineData, this);
    recyclerView.setAdapter(recycleAdapter);
 
    @Override
    void onClick (String value){
        // value this data you receive when increment() / decrement() called
    }
}
cs

Adapter의 코드의 생성자를 보면 마지막 인자가 OnItemClick listener입니다. 이렇게 전달받은 OnItemClick 객체인 mCallback(=listener)를 통해 목표가 되는 Activity나 Fragment에 접근할 수 있습니다!

RecycleAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class RecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
...
    private OnItemClick mCallback;
 
    RecycleAdapter(Context context, List<HashMap<StringString>> onlineData, OnItemClick listener){
        this.onlineData = onlineData;
        this.context = context;
        this.mCallback = listener;
    }
 
 
    public void increment(){
        int currentNos = Integer.parseInt(quantity.getText().toString()) ;
        quantity.setText(String.valueOf(++currentNos));
        mCallback.onClick(quantity.getText().toString());
    }
 
    public void decrement(){
        int currentNos = Integer.parseInt(quantity.getText().toString()) ;
        quantity.setText(String.valueOf(--currentNos));
        mCallback.onClick(quantity.getText().toString());
    }
...
}
cs

위의 예제에서는 onClick의 인자가 String 1개 뿐이라서 Activity에 String 변수 1개만 전달되지만 상황에 맞게끔 interface에서 함수의 원형을 변경해서 사용하면 됩니다.


작성자

Posted by 드리머즈

관련 글

댓글 영역