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;
}