기존에 안드로이드 내에서 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 |