Adpater안에는 반드시 ViewHolder가 있어야하는데 이 ViewHolder는 RecyclerView의 개별 Item의 대한 view를 가지고 있습니다. item_recycler_view가 이 ViewHolder의 View로 생성되며 필요에 따라 custom할 수 있겠죠?
비록 우리는 item_recycler_view에 TextView만 추가했지만 뭐 ImageView도 추가할 수 있고 말이죠.
5-2) 메소드 Overriding
이제 필수적으로 Overriding할 메소드는 다음과 같습니다.
- onCreateViewHolder: ViewHolder를 콘텐츠를 표시하기 위해 사용하는 뷰를 설정하는데, 우리는 이전에 item_recycler_view를 만들었으니 이것을 사용합니다.
- onBindViewHolder: ViewHolder를 binding합니다. 여기서 ViewHolder의 각각 View를 설정할 수 있습니다.
- getItemCount : item의 갯수를 반환합니다. 대부분은 List를 사용하기 때문에 이 List의 size를 반환합니다.
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private List<String> itemList=new ArrayList<>();
public RecyclerAdapter(){
itemList.clear();
for(int i=0;i<10;i++){
itemList.add(i+"번째 아이템");
}
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView item;
public ViewHolder(View itemView){
super(itemView);
item=(TextView)itemView.findViewById(R.id.item);
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_recycler_view,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
ViewHolder holder=(ViewHolder)viewHolder;
holder.item.setText(itemList.get(i));
}
@Override
public int getItemCount() {
return itemList.size();
}
}
ViewHolder를 정의하는데 여기서는 아까 만들었던 item_recycler_view.xlm의 View를 갖고 있습니다. 이 ViewHolder는 개별 item을 갖고 있는 것이나 같죠. 이 ViewHolder는 onCreateViewHolder에서 객체가 생성됩니다.
생성자에는 itemList를 초기화하는데 이 itemList에서 adapter가 binding할때 아이템을 꺼내옵니다. 우선 10개의 아이템을 추가하고 있네요.
이후 notifyDataSetChanged()를 호출하면 이제 데이터의 Set이 바뀌었다고 다시 RecyclerAdapter의 데이터를 표시하게됩니다.
즉, itemList의 아이템이 생기거나 제거됐다면 이후 notifyDataSetChanged()를 호출하세요.
onBindViewHolder에는 ViewHolder에 있는 TextView의 문자열 설정을 하고 끝나네요.
여기까지 잘따라왔다면 프로젝트 구성은 이렇게 되겠네요.
결과
이벤트 추가
여기까지만 진행하면 조금 심심하겠죠? 이제 아이템이 클릭이 되면 Toast로 클릭되었다는 메시지를 띄어봅시다.
interface를 사용하여 listener를 설정할때가 왔군요.
6) RecyclerAdapter에 OnItemClickListener 설정
여기서는 OnItemClickListener라는 interface를 정의하고 객체를 생성합니다.
onBindViewHolder에서 ViewHolder의 아이템이 클릭되었을때 onItemClickListener의 onClick 메소드를 호출합니다. 이 onClick메소드는 바로 MainActivity에서 구현하거나 객체 생성해서 넘길테지요.
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private List<String> itemList=new ArrayList<>();
public interface OnItemClickListener{
public void onClick(String str);
}
private OnItemClickListener onItemClickListener=null;
public RecyclerAdapter(){
itemList.clear();
for(int i=0;i<10;i++){
itemList.add(i+"번째 아이템");
}
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView item;
public ViewHolder(View itemView){
super(itemView);
item=(TextView)itemView.findViewById(R.id.item);
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_recycler_view,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
ViewHolder holder=(ViewHolder)viewHolder;
holder.item.setText(itemList.get(i));
holder.item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onItemClickListener!=null){
onItemClickListener.onClick(itemList.get(i)+" 클릭!!");
}
}
});
}
@Override
public int getItemCount() {
return itemList.size();
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}
}