当前位置: 首页 > 知识库问答 >
问题:

改变布局管理器为不同的视图在RecyclerView

微生俊捷
2023-03-14

我使用列表中的子元素实现了一个可扩展的recyclerview。我遵循了这个准则。这就是它的工作原理,

下面简要描述使用RecyclerView实现ExpandableListView。列表模型有一个附加参数“type”,用于标识项目是标题还是子项。通过检查此参数,适配器将根据类型为view和viewholder充气。如果类型为HEADER,它将扩展HEADER项的布局,其中包含一个TextView和一个ImageView,用于指示子树是否展开。

现在,我要做的是将展开的布局设置为网格。我通常会通过将布局管理器设置为GridLayoutManager来实现这一点,但在这种情况下,我只使用一个recyclerview,这意味着我无法在不更改标题的情况下更改布局管理器,最终导致整个recyclerview变成包含标题的网格。

我的问题是:如何在适配器内仅为几个布局更改布局管理器?

编辑:我添加了一些代码。

Recyclerview适配器:

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

// These are constants that are used to determine if the item is a child or a header and is defined with each item from the data model
public static final int HEADER = 0;
public static final int CHILD = 1;

private List<Item> data;

public ExpandableListAdapter(List<Item> data) {
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
    View view = null;

    LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // Check whether the item is a header or child and inflate differnet layouts
    switch (type) {
        case HEADER:
            // Inflate a header layout if the item is a header
            view = inflater.inflate(R.layout.list_header, parent, false);
            ListHeaderViewHolder header = new ListHeaderViewHolder(view);
            return header;
        case CHILD:
            // Inflate a child layout if the item is a child
            view = inflater.inflate(R.layout.list_child, parent, false);
            ListChildViewHolder child = new ListChildViewHolder(view);
            return child;
    }
    return null;
}

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    final Item item = data.get(position);

    // Bind different layouts based on if the item is a header or child
    switch (item.getType()) {
        case HEADER:
            // ...
        case CHILD:
            // ...
    }
}

@Override
public int getItemViewType(int position) {
    return data.get(position).type;
}

@Override
public int getItemCount() {
    return data.size();
}

// Viewholder for the header items
private static class ListHeaderViewHolder extends RecyclerView.ViewHolder {
    // ...
}

// Viewholder for the child items
private static class ListChildViewHolder extends RecyclerView.ViewHolder {
    // ...
}

这是我声明布局管理器的主要活动:

recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

共有2个答案

江宏伟
2023-03-14

将布局管理器更改为gridlayout管理器,并按如下所述处理跨度大小

layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int type=mAdapter.getItemViewType(position);
                if (type == "view holder type name")
                    return 2;
                else
                    return 1;
            }
        });
张唯
2023-03-14

您可以将布局管理器更改为GridLayoutManager并为标头定义“跨度大小”,例如,如果您想要具有2列的网格,则标头应具有跨度大小2和子跨度大小1:

    GridLayoutManager glm = new GridLayoutManager(getContext(), 2);
    glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            switch(getTypeForPosition(position)) {
                case HEADER:
                    return 2;
                default:
                    return 1;
            }
        }
    });
    recyclerView.setLayoutManager(glm);

这里有一个使用这个库的带有标头的可扩展网格的完整示例。

 类似资料:
  • 根据Building a RecolyerView LayoutManager文章,我已经为RecolyerView创建了自己的自定义布局管理器,但是由于现有的一些文档,我无法找到从布局管理器中强制RecolyView重建动画的方法(就像使用notifyItemInserted或notifyItemDeleted时的动画一样)。这些动画由recyclerView及其项目动画师控制,开发人员只能控制

  • *label1:combo1 label2:combo2 label3:combo3 label4:text1 label5:text2 label6:text3*

  • 我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?

  • 我需要用动画更改RecyclerView的GridLayoutManager跨距计数,但当用户在RecyclerView布局上做出收缩或缩放手势时,我需要这样做。动画应缓慢且持续地跟随用户的手势,直到用户从屏幕上松开手指。

  • 英文原文:http://emberjs.com/guides/views/adding-layouts-to-views/ 视图可以拥有一个次模板来包裹其主模板。如同模板一样,布局是可以插入到视图标签下的Handlebars模板。 通过设置layoutName属性来配置视图的布局模板。 而布局模板通过Handlebars的{{yield}}助手来指定在哪里插入主模板。视图渲染后的template的

  • 我试图使用创建一个厨房显示系统,并试图找出一种方法,当第一行已经满了时,在第二行添加另一个面板。GUI的宽度将根据用户的喜好而改变。当更宽时,它应该每行显示更多的组件。