반응형
RecyclerView 클릭 이벤트 구현하기
RecyclerView를 구현하고 나면 상황에 따라서 각 아이템을 클릭했을 때 여러가지 이벤트 처리를 해주어야 합니다.
이때 ListView의 setOnItemClickListener() 메소드와 같은 기능을 직접 만들어서 사용해야 합니다.
앞서 기본적인 RecyclerView를 구현한 상태에서 아이템 클릭시 해당 위치와 Data를 Toast로 띄우는 기능을 예제로 작성했습니다.
아이템 클릭 이벤트를 위해 추가된 코드 영역은 주석으로 표시해 두었습니다.
기본적인 RecyclerView 사용법은 아래글을 참고하세요.
2021.12.29 - [IT 개발/Android] - [안드로이드] RecyclerView 사용법 (리사이클러뷰)
CustomAdapter.java
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder>{
private ArrayList<String> localDataSet;
//===== [Click 이벤트 구현을 위해 추가된 코드] ==========================
// OnItemClickListener 인터페이스 선언
public interface OnItemClickListener {
void onItemClicked(int position, String data);
}
// OnItemClickListener 참조 변수 선언
private OnItemClickListener itemClickListener;
// OnItemClickListener 전달 메소드
public void setOnItemClickListener (OnItemClickListener listener) {
itemClickListener = listener;
}
//======================================================================
//----- 뷰홀더 클래스 ---------------------------------------------------
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
public TextView getTextView() {
return textView;
}
public void setTextView(TextView textView) {
this.textView = textView;
}
}
//---------------------------------------------------------------------
//----- 생성자 ---------------------------------------------------------
// 생성자를 통해서 데이터를 전달받도록 함
public CustomAdapter (ArrayList<String> dataSet) {
localDataSet = dataSet;
}
//---------------------------------------------------------------------
//----- RecyclerView Adapter 필수 구현 항목 ----------------------------
@NonNull
@Override // ViewHolder 객체를 생성하여 리턴한다.
public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recyclerview_item, parent, false);
CustomAdapter.ViewHolder viewHolder = new CustomAdapter.ViewHolder(view);
//===== [Click 이벤트 구현을 위해 추가된 코드] =====================
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String data = "";
int position = viewHolder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
data = viewHolder.getTextView().getText().toString();
}
itemClickListener.onItemClicked(position, data);
}
});
//==================================================================
return viewHolder;
}
@Override // ViewHolder안의 내용을 position에 해당되는 데이터로 교체한다.
public void onBindViewHolder(@NonNull CustomAdapter.ViewHolder holder, int position) {
String text = localDataSet.get(position);
holder.textView.setText(text);
}
@Override // 전체 데이터의 갯수를 리턴한다.
public int getItemCount() {
return localDataSet.size();
}
//-----------------------------------------------------------------------
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
int newDataNumber = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//----- 테스트를 위한 더미 데이터 생성 --------------------
ArrayList<String> testDataSet = new ArrayList<>();
for (int i = 0; i<20; i++) {
testDataSet.add("TEST DATA" + i);
}
//--------------------------------------------------------
RecyclerView recyclerView = findViewById(R.id.recyclerView);
//--- LayoutManager는 아래 3가지중 하나를 선택하여 사용 ----
// 1) LinearLayoutManager()
// 2) GridLayoutManager()
// 3) StaggeredGridLayoutManager()
//---------------------------------------------------------
LinearLayoutManager linearLayoutManager = new LinearLayoutManager((Context) this);
recyclerView.setLayoutManager(linearLayoutManager); // LayoutManager 설정
CustomAdapter customAdapter = new CustomAdapter(testDataSet);
//===== [Click 이벤트 구현을 위해 추가된 코드] ==============
customAdapter.setOnItemClickListener(new CustomAdapter.OnItemClickListener() {
@Override
public void onItemClicked(int position, String data) {
Toast.makeText(getApplicationContext(), "Position:" + position + ", Data:" + data, Toast.LENGTH_SHORT).show();
}
});
//==========================================================
recyclerView.setAdapter(customAdapter); // 어댑터 설정
//----- 데이터 추가/삭제 버튼 -------------------------------
Button buttonAddItem = findViewById(R.id.buttonAddItem);
Button buttonDeleteItem = findViewById(R.id.buttonDeleteItem);
buttonAddItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testDataSet.add("NEW DATA " + newDataNumber++);
customAdapter.notifyItemInserted(testDataSet.size());
}
});
buttonDeleteItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testDataSet.remove(testDataSet.size()-1);
customAdapter.notifyDataSetChanged(); // 만능, 되도록 사용x
}
});
//-----------------------------------------------------------
}
}
2021.12.30 - [IT 개발/Android] - [안드로이드] RecyclerView 업데이트 및 갱신 방법
반응형
'IT 개발 > Android' 카테고리의 다른 글
[안드로이드] LinearLayout 속성 및 사용방법 (0) | 2022.08.15 |
---|---|
[안드로이드] View와 ViewGroup (화면 구성을 위한 뷰와 뷰그룹) (0) | 2022.08.14 |
[안드로이드] RecyclerView 업데이트 및 갱신 방법 (0) | 2021.12.30 |
[안드로이드] RecyclerView 사용법 (리사이클러뷰) (3) | 2021.12.29 |
[안드로이드] AndroidX 사용하기 (0) | 2021.11.18 |