RecyclerView.Adapter
RecyclerView.Adapter 에 대해서 알아보자. 기존에 ListView 를 많이 썼는데, 이 녀석보다 RecyclerView 를 두면서 좀 더 범용적인 녀석을 만들어서 제공하고 있다.기본적으로 ListView 를 사용했었다면, RecyclerView 를 사용하기 어렵지 않다. 함수가 추가돼서 구조가 조금 복잡해진 느낌이긴 하지만 ListView 의 사용과 비슷하다. 여기서는 ListView 에 대한 지식이 있다는 전제로 이야기를 하려한다.
ListView
ListView 에 대한 간략한 정보는 아래 링크에서 확인하도록 하자.onCreateViewHolder, onBindViewHolder
기본적으로 ListView 에서는 View 에 값을 setting 하는 작업을 getView() 에서 하게 된다. 이 작업이 RecyclerView 로 오면서- onCreateViewHolder
- onBindViewHolder
ViewHolder
이 두 함수의 이름에 있는 ViewHolder 가 무엇일지 궁금해 할지도 모르겠어서 간략하게 이야기 하자면, 원래 ListView 에서는 RecyclerView 처럼 View 를 재사용해서 현재의 View 를 계속 parameter 넘겨주는데, 이 때 이 View 안의 chid view 들에 대한 reference 를 가져와서 사용하게 된다. 이 때 이 reference 를 저장할 공간을 ViewHolder 라는 이름으로 묶어놓고 재사용한다. 이게 보통 ListView 를 일반적으로 사용하는 방법이었다. (말로 설명하니 너무 어렵다. 코드로 확인하자.)getView() vs onCreateViewHolder(), onBindViewHolder()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.drawer_menu_list_item, null);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.count = (TextView) convertView.findViewById(R.id.counter);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
NavDrawerItem item = navDrawerItems.get(position);
int icon = item.getIcon();
holder.title.setTextColor(mTitleColor);
if (item.isSelected()) {
icon = item.getIconSelected();
holder.title.setTextColor(mTitleInversedColor);
}
holder.icon.setImageResource(icon);
holder.title.setText(item.getTitle());
// displaying count
// check whether it set visible or not
if (item.getCounterVisibility()) {
holder.count.setVisibility(View.VISIBLE);
holder.count.setText(item.getCount());
} else {
// hide the counter view
holder.count.setVisibility(View.GONE);
}
return convertView;
}
private static class ViewHolder {
ImageView icon;
TextView title;
TextView count;
}
위의 노란부분이 onCreateViewHolder 부분이라고 생각하면 되고,
파란부분이 onBindViewHolder 부분이 된다고 생각하면 된다.
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_menu_list_item,parent,false); //Inflating the layout
ViewHolder vhItem = new ViewHolder(v,viewType, mOnClickHandler); //Creating ViewHolder and passing the object of type view
return vhItem; // Returning the created object
//inflate your layout and pass it to view holder
} else if (viewType == TYPE_HEADER) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_menu_header,parent,false); //Inflating the layout
ViewHolder vhHeader = new ViewHolder(v,viewType, mOnClickHandler); //Creating ViewHolder and passing the object of type view
return vhHeader; //returning the object created
}
return null;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int drawerItemIndex = position - 1;
NavDrawerItem item = navDrawerItems.get(drawerItemIndex);
int icon = item.getIcon();
holder.title.setTextColor(mTitleColor);
if (item.isSelected()) {
icon = item.getIconSelected();
holder.title.setTextColor(mTitleInversedColor);
}
holder.icon.setImageResource(icon);
holder.title.setText(item.getTitle());
// displaying count
// check whether it set visible or not
if (item.getCounterVisibility()) {
holder.count.setVisibility(View.VISIBLE);
holder.count.setText(item.getCount());
} else {
// hide the counter view
holder.count.setVisibility(View.GONE);
}
}
댓글 없음:
댓글 쓰기