如何在Android中的RecyclerView中添加LinearLayout Manager和GridLayout Manager

时间:2016-03-14 12:43:59

标签: android android-recyclerview recycler-adapter

我需要一个设计来实现像View上的Top图像,底部有一个带有两个coloumns的GridView。所以我打算使用RecyclerView来实现它。首先,我需要使用LinearLayoutManager和底部GridLayoutManager。那么如何使用这两个值创建Recycler Adapter。

2 个答案:

答案 0 :(得分:14)

假设您知道如何使用多种视图类型创建RecyclerView适配器,这就是您为recyclerview指定布局管理器的方式

mAdapter = new MyMultiViewAdapter(); // an imaginary adapter that supports multiple view types

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

GridLayoutManager glm = new GridLayoutManager(this, 2);
glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return 2;
                    case MyAdapter.TYPE_ITEM:
                        return 1;
                    default:
                        return -1;
                }
            }
        });

mRecyclerView.setLayoutManager(glm); 
mRecyclerView.setAdapter(mAdapter);

答案 1 :(得分:3)

RecyclerView需要一个布局管理器。因此,要实现您的需求,您可以使用GridLayoutManager

跨度大小将设置为2,以获得两列。然后,您将使用setSpanSizeLookup将第一个项目标记为跨越两列。在这个视图中,你会把你的"顶部图像"。

public boolean isHeader(int position) {
    return position == 0;
}

GridLayoutManager manager = new GridLayoutManager(this, 2);
manager.setSpanSizeLookup(new SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return isHeader(position) ? 2 : 1;
    }
 });
 recyclerView.setLayoutManager(manager);   

然后,onCreateViewHolder可以根据该位置的项目类型返回不同的视图持有者。

@Override
public int getItemViewType(int position) {
    return isHeader(position) ? VIEW_TYPE_HEADER : VIEW_TYPE_ITEM;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == VIEW_TYPE_HEADER) {
        // Setup header view holder
        return new HeaderViewHolder(...);
    }
    // Setup item view holder
    return new ItemViewHolder(...)
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if (isHeader(position)) {
        return;
    }
    // Bind item to the item view holder
}

希望这有帮助!