[컴][안드로이드] BaseAdapter 와 RecyclerView.Adapter




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);
    }
}



See Also

  1. Android RecyclerView 사용하기 - KMSHACK
  2. Recycler View Item Click Listener
  3. RecyclerView - Xamarin




댓글 없음:

댓글 쓰기