【问题标题】:Android RecyclerView inside RecyclerView?RecyclerView里面的Android RecyclerView?
【发布时间】:2016-07-20 15:26:56
【问题描述】:

我正在使用显示不同类别列表的RecyclerView。每个行项目还包含RecyclerView 以显示类别项目的列表。父RecyclerView 填充垂直LinearLayoutManager,子RecyclerViews 填充GridLayoutManager(2 列)。 Child RecyclerViews 没有显示除前 2 个之外的所有类别项目,即使它有很多类别项目。所有剩余的类别项目都隐藏在特定类别中。换句话说,您可以说 child RecyclerView 没有像它包含的项目那样扩展。

我在这里找到了不同的解决方案,但没有一个有效。这就是为什么再次发布。

【问题讨论】:

  • 您只需要使用一个回收站视图。提供更多带有结果的图像代码,我将尝试解释更多
  • 即使你有一个嵌套的recyclerview,如果没有一些额外的工作你也无法滚动它。
  • 你可以嵌套 RecyclerViews(当我听到这个时我大吃一惊)......但是如果不共享代码就无法解决这个问题。
  • 如果我理解正确,您希望顶级视图仅支持垂直滚动,而子级 仅支持垂直滚动 - 对吗?一个模型或一些示例代码在这里会很有帮助。

标签: android android-recyclerview


【解决方案1】:

使用library,您只需一个 RecyclerView 即可轻松实现。见下图:

首先创建一个Section类:

class MySection extends StatelessSection {

    String title;
    List<String> list;

    public MySection(String title, List<String> list) {
        // call constructor with layout resources for this Section header, footer and items 
        super(R.layout.section_header, R.layout.section_item);

        this.title = title;
        this.list = list;
    }

    @Override
    public int getContentItemsTotal() {
        return list.size(); // number of items of this section
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        // return a custom instance of ViewHolder for the items of this section
        return new MyItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyItemViewHolder itemHolder = (MyItemViewHolder) holder;

        // bind your view here
        itemHolder.tvItem.setText(list.get(position));
    }

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return new MyHeaderViewHolder(view);
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;

        // bind your header view here
        headerHolder.tvItem.setText(title);
    }
}

然后你用你的部分设置 RecyclerView:

// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();

// Create your sections with the list of data for each year
MySection section1 = new MySection("Categories 1", categories1DataList);
MySection section2 = new MySection("Categories 2", categories2DataList);

// Add your Sections to the adapter
sectionAdapter.addSection(section1);
sectionAdapter.addSection(section2);

// Set up your RecyclerView with the SectionedRecyclerViewAdapter
GridLayoutManager glm = new GridLayoutManager(getContext(), 2);
glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        switch(sectionAdapter.getSectionItemViewType(position)) {
            case SectionedRecyclerViewAdapter.VIEW_TYPE_HEADER:
                return 2;
            default:
                return 1;
        }
    }
});
recyclerView.setLayoutManager(glm);
recyclerView.setAdapter(sectionAdapter);

【讨论】:

  • 我使用了这个库,它运行良好,但有点生涩。现在我想将加载更多(想从服务器加载更多记录)功能添加到这个 recyclerview 列表。怎样才能让它流畅并实现分页?
  • 1) 在您的 MySection 类中创建“addItem”方法以将新项目添加到您的列表中; 2)使用“addItem”方法将项目添加到您的部分; 3) 调用sectionAdapter的notifyDataSetChanged;
  • 我没有要求这个。我想知道如何知道我的列表在滚动时已到达底部,以便我可以调用 api 从服务器获取下一页记录?我知道如何在列表中添加新项目。你能不能帮我把它弄光滑,因为它有点生涩。
  • 对于“生涩”问题,您应该打开另一个问题并粘贴您的代码和您的 xml 布局,否则没有人能帮上忙,对于负载更多您可以查看:stackoverflow.com/questions/27841740/…跨度>
  • 很高兴听到它有效,请考虑将我的答案标记为正确,然后单击我答案右上角的勾号。欢呼
猜你喜欢
  • 2015-07-28
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多