Android
RecyclerView + GridLayoutManager 이용시 row 넣기
aucd29
2018. 2. 8. 16:04
GridLayoutManager 를 이용해 RecyclerView 를 구성하였는데 중간 중간에 Group 구분을 주기 위해서 Bar 형태의 View 를 추가해야 되는 요청 사항이 생겼다.
여기저기 검색을 하다간 찾은 내용으로는 (https://stackoverflow.com/questions/42339650/custom-view-row-in-recyclerview-with-gridlayoutmanager)
GridLayoutManager 에 setSpanSizeLookup 을 이용하면 되는 것 이였고 데이터 입력 시 ViewType 을 기준으로 반환하는 span 크기를 다르게 하면 되었다.
일반적인 Grid 의 경우 1 을 전달하면되고 Bar 형태의 경우 Grid 의 최대 개수를 (HTML 에서 rowspan, colspan 을 생각하면 된다.) 전달 하면 된다.
final GridLayoutManager mng_layout = new GridLayoutManager(this.getActivity(), 2);
mng_layout.setSpanSizeLookup( new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch( recyclerAdapter.getItemViewType(position) ) {
case MyRecyclerAdapter.TYPE_SINGLE:
return 1;
case MyRecyclerAdapter.TYPE_DEFAULT:
return 2;
default:
return -1;
}
}
});
myRecyclerView.setLayoutManager(mng_layout);
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
if (viewType==TYPE_DEFAULT) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_grid_view_item, parent, false);
return new DefaultViewHolder(view);
} else if (viewType==TYPE_SINGLE){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_grid_view_header, parent, false);
return new SingleItemViewHolder(view);
}
throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly");
}
@Override
public int getItemViewType(int position) {
return (list.get(position).getType()==TYPE_DEFAULT) ? TYPE_DEFAULT : TYPE_SINGLE;
}
여기저기 검색을 하다간 찾은 내용으로는 (https://stackoverflow.com/questions/42339650/custom-view-row-in-recyclerview-with-gridlayoutmanager)
GridLayoutManager 에 setSpanSizeLookup 을 이용하면 되는 것 이였고 데이터 입력 시 ViewType 을 기준으로 반환하는 span 크기를 다르게 하면 되었다.
일반적인 Grid 의 경우 1 을 전달하면되고 Bar 형태의 경우 Grid 의 최대 개수를 (HTML 에서 rowspan, colspan 을 생각하면 된다.) 전달 하면 된다.
final GridLayoutManager mng_layout = new GridLayoutManager(this.getActivity(), 2);
mng_layout.setSpanSizeLookup( new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch( recyclerAdapter.getItemViewType(position) ) {
case MyRecyclerAdapter.TYPE_SINGLE:
return 1;
case MyRecyclerAdapter.TYPE_DEFAULT:
return 2;
default:
return -1;
}
}
});
myRecyclerView.setLayoutManager(mng_layout);
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
if (viewType==TYPE_DEFAULT) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_grid_view_item, parent, false);
return new DefaultViewHolder(view);
} else if (viewType==TYPE_SINGLE){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_grid_view_header, parent, false);
return new SingleItemViewHolder(view);
}
throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly");
}
@Override
public int getItemViewType(int position) {
return (list.get(position).getType()==TYPE_DEFAULT) ? TYPE_DEFAULT : TYPE_SINGLE;
}