기존에 안드로이드 내에서 item목록을 보여주기 위해서는 ListView 컴포넌트를 사용했었다.

문제는 listView가 스크롤(scroll)되면서 getView내에서 계속해서 v.findViewById() 함수를 호출하게 되는데, 이는 불필요한 연산일뿐아니라,

UI성능 저하를 가져온다. 그래서 꼭 필수적으로 쓸 사항은 아니지만, 구글에서는 암묵적으로 ViewHolder 패턴을 쓰라고 권장하고 있는데,

아래와 같다.

   1: @Override
   2:   public View getView(int position, View convertView, ViewGroup parent)
   3:   {
   4:     PersonViewHolder viewHolder;
   5:  
   6:     // 캐시된 뷰가 없을 경우 새로 생성하고 뷰홀더를 생성한다
   7:     if(convertView == null)
   8:     {
   9:         convertView = mInflater.inflate(mLayout, parent, false);
  10:  
  11:         viewHolder = new PersonViewHolder();
  12:         viewHolder.icon = (ImageView) convertView.findViewById(R.id.iconImage);
  13:         viewHolder.name = (TextView) convertView.findViewById(R.id.name);
  14:         viewHolder.address = (TextView) convertView.findViewById(R.id.address);
  15:         viewHolder.phone = (TextView) convertView.findViewById(R.id.phone);
  16:  
  17:         convertView.setTag(viewHolder);
  18:     }
  19:     // 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용한다
  20:     else
  21:     {
  22:         viewHolder = (PersonViewHolder) convertView.getTag();
  23:     }
  24:  
  25:     viewHolder.name.setText(mItemList.get(position).getName());
  26:     viewHolder.address.setText(mItemList.get(position).getAddress());
  27:     viewHolder.phone.setText(mItemList.get(position).getPhone());
  28:  
  29:     return convertView;

30: }

저렇게 매번 converView를 생성 하는게 아니라, null이 아니면 재사용하는 방법을 사용한다.

하지만, 이제는 Recyclerview를 사용한다면, 저렇게 하지 않아도 된다.

아래는 내가 앱 내에서 게시판 글 목록을 보여주기 위해 만들어본, 게시판 리스트 뷰이다.

   1: static private class ArticleListAdapter extends RecyclerView.Adapter<ArticleListAdapter.ArticleItem>
   2:     {
   3:         ArrayList<Article> mList = null;
   4:         public ArticleListAdapter(ArrayList<Article> articles)
   5:         {
   6:             mList = articles;
   7:         }
   8:  
   9:         @Override
  10:         public ArticleItem onCreateViewHolder(ViewGroup parent, int viewType) {
  11:             //새로운 itemView가 필요시마다 호출된다.
  12:  
  13:             LayoutInflater inflater = LayoutInflater.from(MyApplication.mContext);
  14:  
  15:             View rootView = inflater.inflate(R.layout.fragment_board_article_row_item,parent,false);
  16:  
  17:             return new ArticleItem(rootView);
  18:         }
  19:  
  20:         @Override
  21:         public void onBindViewHolder(ArticleItem holder, int position) {
  22:           /* itemView가 ArticleItem holder로 넘어오면 우리는 그냥 받아 쓰면된다.
  23:             그것이 화면에서 사라져 재활용되기 위해서 온 view일수도 있고, 새로 만들어진 view일수도있지만
  24:             사용자는 그것에 대해 신경쓸필요없다.*/
  25:             Article article = mList.get(position);
  26:             holder.setTitle(article.getTitle());
  27:             switch (article.getType())
  28:             {
  29:                 case "normal":
  30:                     holder.setType(ArticleItem.ArticleType.NORMAL);
  31:                     break;
  32:                 case "notice":
  33:                     holder.setType(ArticleItem.ArticleType.NOTICE);
  34:                     break;
  35:             }
  36:             holder.setDate(article.getDate());
  37:             holder.setNick(article.getNickName());
  38:  
  39:  
  40:  
  41:         }
  42:  
  43:         @Override
  44:         public int getItemCount() {
  45:             return mList.size();
  46:         }
  47:  
  48:         /*
  49:         * 이전까지 썻던 ViewHolder패턴에서 직접 만들어 쓰던 ViewHolder다.
  50:         * 이제는 만들어 쓸필요없이, RecyclerView에서 자체적으로 제공해주는것을
  51:         * 상속해 쓰기만 하면된다.
  52:         * */
  53:         static class ArticleItem extends RecyclerView.ViewHolder
  54:         {
  55:             enum ArticleType {NOTICE,NORMAL}
  56:             TextView mTitleView = null;
  57:             TextView mDateView = null;
  58:             TextView mNickView = null;
  59:             TextView mArticleTypeView = null;
  60:  
  61:             public ArticleItem(View itemView) {
  62:                 super(itemView);
  63:                 mDateView = (TextView) itemView.findViewById(R.id.articleDate);
  64:                 mTitleView = (TextView) itemView.findViewById(R.id.articleTitle);
  65:                 mArticleTypeView = (TextView) itemView.findViewById(R.id.articleType);
  66:                 mNickView = (TextView) itemView.findViewById(R.id.author);
  67:             }
  68:             public void setDate(String date)
  69:             {
  70:                 mDateView.setText(date);
  71:             }
  72:             public void setTitle(String title)
  73:             {
  74:                 mTitleView.setText(title);
  75:             }
  76:             public void setType(ArticleType type)
  77:             {
  78:                 if(type == ArticleType.NOTICE)
  79:                 {
  80:                     mArticleTypeView.setText("공지");
  81:                 }
  82:                 else
  83:                 {
  84:                     mArticleTypeView.setText("일반");
  85:                 }
  86:             }
  87:             public void setNick(String nick)
  88:             {
  89:                 mNickView.setText(nick);
  90:             }
  91:         }
  92: }

'android' 카테고리의 다른 글

안드로이드 RecyclerView 스크롤 감지  (0) 2016.04.26
네트워크 상태 체크 하기  (1) 2016.04.26
UI Thread 사용법  (0) 2016.04.24

+ Recent posts