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

4

我需要实现一个视图,顶部是一张图片,底部有一个包含两列的GridView。因此,我计划使用RecyclerView来实现它。对于顶部,我需要使用LinearLayoutManager,底部则需要使用GridLayoutManager。那么我要如何创建一个具备这两个值的Recycler适配器呢?


使用GridLayoutManager和spanSizeLookUp? - Much Overflow
2个回答

16

假设您知道如何使用多个视图类型创建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);

MyAdapter在这里是什么意思? - Mohtashim

4

RecyclerView只能使用一个布局管理器。因此,为了实现您需要的效果,您需要使用GridLayoutManager

span size设置为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
}

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接