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); } }
댓글 없음:
댓글 쓰기