본문 바로가기
Android 기법/# Study

[Android/안드로이드]RecyclerView 헤더 쉽게 만들기

by 퍼즐잎 2017. 7. 6.




페이스북의 레이아웃 구성을 만들어보는 예제 중 다음과 같이 하나의 RecyclerView에서


다른 모양의 아이템을 추가하기 위해 Header를 만들게 되었습니다.



RecyclerView의 어뎁터 부분에서 onCreateViewHolder 부분을 보면 두 번째 인자로 viewType이 있습니다.


이 값이 0인 경우 헤더를 만들게 됩니다.



기존에 다른 아이템을 생성할 때 이 아이템을 그려주는 대신에 Header를 만들어 주는것 이기 때문에


getItemCount() 에서 전체 데이터의 개수 +1을 해주어야 합니다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 
 
public class BoardItem extends RecyclerView.Adapter<BoardItem.ViewHolder> {
 
    private boolean headerFlag = false// 헤더인지 아닌지 구분 하기 ㅟ한 플레그
    private LayoutInflater mInflater;
 
 
    public BoardItem(Context context)
    {
        this.mInflater = LayoutInflater.from(context);
    }
 
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 
        View view;
        //viewType이 0이면 헤더이므로 flag를 설정하고 헤더 아이템을 inflater를 이용해서 할당한다
        if(viewType == 0) {
            headerFlag = true;
            view = mInflater.inflate(R.layout.activity_header_item, parent, false);
        }
        //헤더가 아닌 나머지 콘텐츠들
        else {
            headerFlag = false;
            view = mInflater.inflate(R.layout.activity_item, parent, false);
        }
 
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }
 
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(!holder.isHeader) // 헤더가 아닌 경우 바인딩
            bodyBindInit(holder,position);
        else // 헤더인 경우 바인딩
            headerBindInit(holder);
    }
 
    //헤더 바인드
    private void headerBindInit(final ViewHolder holder)
    {
        ...
    }
 
    //헤더가 아닌경우 게시물들을 바인드
    private void bodyBindInit(final ViewHolder holder, final int position)
    {
       ...
    }
 
   
    //RecyclerView에서 게시물 순서 꼬이는 문제 해결을 위한 코드
    @Override
    public int getItemViewType(int position) {
        return position;
    }
 
    //0번 위치에 헤더가 들어가기 때문에 +1 을 통해 모든 게시물들을 그려줄 수 있도록 한다.
    @Override
    public int getItemCount() {
        return 데이터의 갯수+1;
    }
 
    ...
 
    public class ViewHolder extends RecyclerView.ViewHolder {
 
        //ViewHolder 안의 변수로 체크 안하면 에러가 발생
        boolean isHeader = headerFlag; // 전역의 플레그를 ViewHolder로 가지고 와서 체크를 합니다.
 
        public ViewHolder(View itemView)
        {
            super(itemView);
 
            if(!isHeader)
                init(itemView);
            else
                headerInit(itemView);
        }
 
        //헤더 값 초기화
        private void headerInit(View itemView)
        {
           ...
        }
 
        //게시글 값 초기화
        private void init(View itemView)
        {
           ...
        }
 
 
    }
}
cs


댓글