RecyclerView의 클릭 이벤트

2018. 11. 25. 17:52Coding/Android Studio

728x90

이 글은

RecyclerView 기본 사용법 과 이어집니다.





1. UserViewHolder

public class UserViewHolder extends RecyclerView.ViewHolder {

//외부 접근이 용의하게 public으로 선언
public TextView tvUserId, tvId, tvTitle, tvBody;
public ImageView ivImg;

//itemView가 리스트의 item인 item_user.xml을 불러옴.
public UserViewHolder(@NonNull View itemView) {
super(itemView);
// R에서 에러나면 하라는대로 R을 추가해주면된다.
// alt+enter로 추가했다.
tvUserId = itemView.findViewById(R.id.tv_userId);
tvId = itemView.findViewById(R.id.tv_id);
tvTitle = itemView.findViewById(R.id.tv_title);
tvBody = itemView.findViewById(R.id.tv_body);
}
}

기존 소스에서 아래 내용을 추가한다.



public ImageView ivImg;

ivImg = itemView.findViewById(R.id.iv_img);

클릭 이벤트를 위해 새로운 이미지를 넣었다.



public class UserViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

List의 각각의 item을 담당하는 UserViewHolder에 View.OnClickListener를 implements해준다.



@Override
public void onClick(View v) {

}

에러가 뜨며 onClick() 메소드를 오버라이드 하라고 한다. alt+enter로 오버라이드 해준다.



ivImg.setOnClickListener(this);

클릭 할 ivImg에 setOnClickListener()를 달아준다.



@Override
public void onClick(View v) {

switch (v.getId()){
break;
}
}

onClick()에 switch문까지 넣어주면 기본적인 클릭 이벤트 모양은 다 만들었다.




2. UserAdapter

이제 클릭 이벤트가 실제 데이터가 있는 UserAdapter에 접근 할 수 있게 만들어야 한다. 

public class UserAdapter extends RecyclerView.Adapter<UserViewHolder> {

private Context mContext;
private ArrayList<UserItem> userItems;

public UserAdapter(Context mContext, ArrayList<UserItem> listItem) {
this.mContext = mContext;
this.userItems = listItem;
}

@NonNull
@Override
// 뷰홀더 생성
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View baseView = View.inflate(mContext, R.layout.item_user,null);
UserViewHolder userViewHolder = new UserViewHolder(baseView);
return userViewHolder;
}

@Override
// 뷰홀더를 리스트와 연결
public void onBindViewHolder(@NonNull UserViewHolder userViewHolder, int position) {

UserItem item = userItems.get(position);
userViewHolder.tvUserId.setText(""+item.getUserId());
userViewHolder.tvId.setText(""+item.getId());
userViewHolder.tvTitle.setText(item.getTitle());
userViewHolder.tvBody.setText(item.getBody());
}

@Override
// 아이템 개수
public int getItemCount() {
return userItems.size();
}
}

기존 소스에서 아래 내용을 추가한다.



UserViewHolder userViewHolder = new UserViewHolder(baseView, this);

UserViewHolder에서 adapter에 접근 할 수 있게 this를 추가해준다.

에러가나면 alt+enter로 UserViewHolder의 생성자에 추가해준다.

이제 UserViewHolder에서 UserAdapter를 받아서 쓸 수 있다.




3.UserViewHolder

public UserAdapter adapter;

public UserViewHolder(@NonNull View itemView, UserAdapter userAdapter) {
super(itemView);
adapter = userAdapter;

.

.

.

}

생성자에 UserAdapter userAdapter가 생겼으니,

UserAdapter adapter 를 하나 만들어서 userAdapter를 받아온다.



@Override
public void onClick(View v) {
int position = getAdapterPosition();

switch (v.getId()){
case R.id.iv_img:
adapter.onImgClicked(position);
break;
}
}

이제 adapter에 접근 할 수 있으니, 클릭이벤트를 만들 수 있다.

int position을 만들어서 getAdapterPosition()으로 인덱스 번호를 가져온다.

adapter.메소드명(position)을 만든다. 메소드명은 새로 만들 메소드라서 당연히 에러가 뜬다. alt+enter로 adapter쪽에 함수를 만들어주자.




4.UserAdapter

public void onImgClicked(int position) {
UserItem item = userItems.get(position);
Toast.makeText(mContext, item.getId()+" / " + position +" : Clicked!!!", Toast.LENGTH_SHORT).show();
}

UserAdapter에 빈 메소드가 생겼을텐데, 여기서 클릭 이벤트에 관한 데이터를 다루면된다.






번외...

public void onImgClicked(int position) {
UserItem item = userItems.get(position);
item.setId(item.getId()+1);
notifyDataSetChanged();
Toast.makeText(mContext, item.getId()+" / " + position +" : Clicked!!!", Toast.LENGTH_SHORT).show();
}

버튼을 클릭 할 때마다 Id값을 1씩 증가시키려면,

위처럼 getId()해온 값에 1을 더하고, setId()를 해주면 된다.

이렇게만하면 데이터는 변했지만, RecyclerView의 값은 그대로이므로, notifyDataSetChanged()를 해서 새로고침을 해줘야 한다.


728x90