Kotlin

adapter에서 엑티비티나, 프래그먼트로 데이터 보내기, 이벤트

Machine_웅 2019. 2. 19. 16:14
728x90
반응형

필요한 것

인터페이스!!!!

 

interface list_onClick_interface {

fun onCheckBox(friend_data: friend_data)

}

인터 페이스를 만들어 줍니다.

 

 

다음으로. 엑티비티나, 프래그먼트가 이 인터페이스를 상속 받도록 합니다.

 

 

class OnwToGroup_Chatting : Fragment(),list_onClick_interface

이렇게요,  그리고  위에서  선언한 

 

 fun onCheckBox(friend_data: friend_data)

요녀석을 정의해 줍니다.

 

그리고  이제는 어댑터 내부!

 

class invite_friend_list_Adapter (val context: Context, val friend_DataArray: MutableList<friend_data>,
var list_onClick_interface: list_onClick_interface,
) : RecyclerView.Adapter<mViewH>()

list_onClick_interface: list_onClick_interface 를  받을수 있도록 생성자를 지정해 줍니다.

 

 

그리고  어댑터 세팅 하시고,

 

list_onClick_interface.onCheckBox(데이터)

 

이런식으로 사용해주시면 됩니다.

 

 

 

 

참고 및 출처 :  https://dreamaz.tistory.com/241

 

 

 

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에서 함수의 원형을 변경해서 사용하면 됩니다.

 

728x90
반응형