안드로이드 어댑터에서 프로그먼트나 액티비티 함수 사용하는 법
안녕하세요. 개발자 드리머즈입니다.
이번 포스팅에서는 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에 접근하는 방법이 무엇인지 어떤 방석이 정석인지 찾아봤습니다.
위의 스택오버플로우에 나와있는 답안이 정석이라고 불릴만한 방법인 것 같습니다.
여기서 간단하게 그 방법을 보겠습니다.
먼저 OnItemClick이라는 interface를 정의합니다. 이 인터페이스의 내부에 onItemClick이라는 함수의 프로토타입을 정의합니다.
OnItemClick.java
1 2 3 | public interface OnItemClick { void onClick (String value); } | cs |
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 |
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<String, String>> 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 |
댓글 영역