페이스북의 레이아웃 구성을 만들어보는 예제 중 다음과 같이 하나의 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 |
댓글