뷰홀더에 있는 뷰에 이벤트(Click등)를 설정하시려는 건가요?
RecyclerView를 사용할 때는 직접 뷰홀더에 접근하지 않고 모든 처리를 어댑터를 통하여 하게 됩니다. 뷰홀더에 있는 버튼에 OnClickListener를 설정하려고 한다면, 이 또한 어댑터를 통하여 처리하시면 됩니다. 아래 코들 참고하세요.
public class ImageAdapter extends RecyclerView.Adapter<ImageViewHolder> {
private static final String TAG = "CustomAdapter";
private List<ImageInfo> mDataSet = new ArrayList<>();
interface Listener {
void onImageChecked(ImageInfo imageInfo);
}
private Listener mListener;
public ImageAdapter(List<ImageInfo> dataSet, Listner listener) {
mDataSet = dataSet;
mListener = listener;
}
public void setData(List<ImageInfo> dataSet) {
mDataSet = dataSet;
notifyDataSetChanged();
}
public void setListener(Listener listener) {
this.mListener = listener;
}
@Override
public ImageViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.row_item, viewGroup, false);
return new ViewHolder(v, listener);
}
@Override
public void onBindViewHolder(ImageViewHolder viewHolder, final int position) {
viewHolder.bind(getItem(position);
}
private ImageInfo getItem(int position) {
return mDataSet.get(position);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataSet.length;
}
}
public static class ImageViewHolder extends RecyclerView.ViewHolder {
private final ImageView imageView;
private final Checkbox checkBox;
private final Listener listener;
public ViewHolder(View v, Listener listener) {
super(v);
imageView = v.findViewById(R.id.imageView);
button = v.findViewById(R.id.button);
this.listener = listener;
}
public void bind(Imageinfo data) {
imageView.setImageResource(data.getDrawableId());
checkBox.setChecked(data.isChecked());
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) listener.onImageChecked(data)
}
});
}
}
어댑터에 리스너를 설정하는 코드는 어댑터를 사용하는 액비티티/프래그먼트에서 해줍니다.
// Activity
private ImageAdapter imageAdapter;
public void onCreate(...) {
super.onCreate(...);
imageAdapter = new ImageAdapter(getImageData(), new ImageAdapter.Listener() {
@Override
public void onImageChecked(ImageInfo imageInfo) {
// Do something()
}
}
recyclerView.setAdapter(imageAdapter);
}
private void refreshWithVisbleImges(List<ImageInfo> data) {
imageAdapter.setDataSet(data);
}