IT_Programming/Android_Java

[펌] 리사이클러 뷰(RecyclerView) Header / Footer 붙이기

JJun ™ 2015. 10. 28. 16:59



 출처

 : http://blog.naver.com/brane7/220520712640




리스트 뷰의 경우 headerView를 붙일수 있는 기능이있었으나

 

recyclerView경우는 기능이 없다 그래서 뷰홀더에 헤더뷰의 아이템을 추가 시켜야 한다

 

개념은  예를들어 아이템의 길이가 10일경우  맨앞쪽 헤더0을 집어 넣게 되면  총길이는 11이고  푸터를 추가하면 12가 된다

 

스크롤링시 해당 포지션의 타입을 불러오는데 이때 포지션값의 -1을 해주어야 0을 참조 하게 된다

 

푸터만 추가 할경우 getItemCount 에서 +1 만 해주면 된다 그리고 item.size의 경우 size가 마지막 이르모 그대로 넣어주면된다

 

아답타에서

 

 

package com.hmallapp.main.adapter.MainTab;

import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.hmallapp.R;
import com.hmallapp.common.custom.FadeInNetworkImageView;
import com.hmallapp.main.custom.MainTab.GoodealHeader;
import com.hmallapp.main.custom.MainTab.Footer;
import com.hmallapp.main.custom.MainTab.HomeSlideBanner;
import com.hmallapp.main.dao.MainTab.HomeItemData_Real;
import com.hmallapp.main.vo.MainHomeItemListVO;

import java.util.ArrayList;

public class GoodealAdapter extends RecyclerView.Adapter<GoodealAdapter.ViewHolder> {

private Context mContext;
private Resources res;

private ArrayList<MainHomeItemListVO> items;


​//타입으로 사용될 상수 선언
private static int TYPE_HEADER = 0;
private static int TYPE_FOOTER = 3;


public GoodealAdapter(Context context, ArrayList<MainHomeItemListVO> items) { // SideMenuAdapter Constructor with titles and icons parameter
this.mContext = context;
this.res = context.getResources();
this.items = items;
//리스트 아이템의 끝에 붙어야 하므로 items.size() 를 넣어주고 헤더가 들어가므로 푸터의 경우 +1 을 해주어야 한다
TYPE_FOOTER = items.size() + 1;

}






public static class ViewHolder extends RecyclerView.ViewHolder {
int Holderid;

public GoodealHeader header;
public Footer footer;


public ViewHolder(View itemView, int viewType) {
super(itemView);
//헤더의 경우 인덱스를 0으로 만들고
if (viewType == TYPE_HEADER) {
header = (GoodealHeader) itemView.findViewById(R.id.goodealHeaderContainer);
Holderid = 0;
//푸터의 경우 위에서 설정한 맨 마지막+1을 해준값을 참조 한다
} else if (viewType == TYPE_FOOTER) {
footer = (Footer) itemView.findViewById(R.id.footerContainer);
Holderid = TYPE_FOOTER;
} else {
Holderid = 10000;
}

}
}


@Override
public GoodealAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
int layout = 0;

if (viewType == TYPE_HEADER) {
layout = R.layout.layout_main_tab_goodeal_header;

} else if (viewType == TYPE_FOOTER) {
layout = R.layout.layout_footer;

} else {
layout = R.layout.layout_main_tab_goodeal_img_txt_product;
}

v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false); //Inflating the layout
ViewHolder vhHeader = new ViewHolder(v, viewType); //Creating ViewHolder and passing the object of type view

return vhHeader;

}


@Override
public void onBindViewHolder(GoodealAdapter.ViewHolder viewHolder, int position) {

if (viewHolder.Holderid == TYPE_HEADER) {
viewHolder.header.initPage();

} else if (viewHolder.Holderid == TYPE_FOOTER) {
viewHolder.footer.initPage();
} else {

}

}

//바인드뷰에서 해당 위치값 즉 0이 들어오면 해더true를 반환하고
private boolean isPositionHeader(int position) {
return position == TYPE_HEADER;
}
//맨 마지막 일경우 푸터true를 반환한다
private boolean isPositionFooter(int position) {
return position == TYPE_FOOTER;
}


// Witht the following method we check what type of view is being passed
@Override
public int getItemViewType(int position) {
//이부분이 중요한데 position의 경우 0부터 순차적으로 아이템 길이 만큼 나타나게 된다 그래서 0의 경우 헤더로 잡아주고 아이템총 길이+1 에는 푸터를 잡아준다

if (isPositionHeader(position)) {
return TYPE_HEADER;

} else if (isPositionFooter(position)) {
return TYPE_FOOTER;

} else {
//position은 0번 부터 시작이므로 Header0번시작하고 1번 들어감
int type = items.get(position - 1).getItemType();
return type;
}

}
//헤더랑 푸터 두가지가 추가 됬으르모 2를 더해준다
@Override
public int getItemCount() {
return items.size() + 2;
}



}