使用 RecyclerView 作为 ExpandableListView 的子级

Posted

技术标签:

【中文标题】使用 RecyclerView 作为 ExpandableListView 的子级【英文标题】:Using RecyclerView as the child of ExpandableListView 【发布时间】:2018-06-21 11:09:09 【问题描述】:

I built a horizontal scrolling list as the child of ExpandableListView. The horizontal list is made up by RecyclerView and CardView. Please click this link to see the picture.

一切似乎都很好,但其中一些水平滚动列表会表现得很奇怪。无论我展开或折叠相同或不同的组多少次,我都希望保持滚动列表的位置相同。例如,如果我展开组“Comp 203”并滚动水平列表后,我们可以看到“assignment14”是水平列表中的第一个。无论我展开或折叠该组或不同组多少次,我都希望将“assignment14”作为第一个。

但是,当我展开“Comp 202”等其他组时,“Comp 202”组中的水平列表看起来与“Comp 203”组中的列表完全相同。

public class CustomExpandableListAdapter extends BaseExpandableListAdapter 
    
        @Override
        public View getChildView(int listPosition, final int expandedListPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent) 
            assignmentList =
                    (List<Assignment>) getChild(listPosition, expandedListPosition);
    
            if (convertView == null) 
                LayoutInflater layoutInflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.list_item, null);
                recyclerViewAssignment = (RecyclerView) convertView
                        .findViewById(R.id.expandedListItem);
                //if (recyclerViewAssignment == null) 
                assignmentAdapter = new AssignmentAdapter(assignmentList);
                mLayoutManager =
                        new LinearLayoutManager(this.context,
                                LinearLayoutManager.HORIZONTAL, false);
                recyclerViewAssignment.setLayoutManager(mLayoutManager);
                recyclerViewAssignment.setItemAnimator(new DefaultItemAnimator());
                recyclerViewAssignment.setAdapter(assignmentAdapter);
                //
                assignmentAdapter.notifyDataSetChanged();
            
    
            return convertView;
        
    

我只将 getChildView() 方法留在了 CustomExpandableListAdapter 中,因为我怀疑问题出在哪里。

【问题讨论】:

折叠“Comp 203”并再次展开时会发生什么?它会直接进入第一个位置吗?这是默认行为。 现在不会,但是会复制其他组的位置。在这个版本之前,它确实排在了第一位,因为我创建了 RecyclerView 而没有检查 convertView 是否为空。我想知道无论我们展开和折叠相同或不同的组多少次,我们是否可以保持该位置。 您必须自己跟踪(使用 apt 类型的变量,例如 int[]),并在返回列表后使用它重新定位列表。 【参考方案1】:

在 if 块的末尾,我使用 HashMap 来存储新创建的子视图,并尝试在“getChildView()”的第三行检索它。

    public View getChildView(int listPosition, final int expandedListPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) 

        final List<Assignment> assignmentList =
                (List<Assignment>) getChild(listPosition, expandedListPosition);

        String groupName = (String)getGroup(listPosition);
        convertView = assignmentRecyclerViewList.get(new Integer(listPosition));

        if (convertView == null) 
            LayoutInflater layoutInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_item, null);

            AssignmentAdapter assignmentAdapter;
            RecyclerView recyclerViewAssignment;
            RecyclerView.LayoutManager mLayoutManager;

            recyclerViewAssignment = (RecyclerView) convertView
                .findViewById(R.id.expandedListItem);

            assignmentAdapter = new AssignmentAdapter(assignmentList);
            mLayoutManager =
                    new LinearLayoutManager(this.context,
                            LinearLayoutManager.HORIZONTAL, false);

            recyclerViewAssignment.setLayoutManager(mLayoutManager);
            recyclerViewAssignment.setItemAnimator(new DefaultItemAnimator());
            recyclerViewAssignment.setAdapter(assignmentAdapter);

            assignmentRecyclerViewList.put(new Integer(listPosition), recyclerViewAssignment);
        

        return convertView;
    

然后,我在 ExpandableListView 的 OnGroupExpand 内部的 MainActivity 中调用“getChildView()”。

        expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() 
            @Override
            public void onGroupExpand(int i) 
                expandableListView.getExpandableListAdapter().getChildView(i, i, false,null,null );
            
        );

【讨论】:

以上是关于使用 RecyclerView 作为 ExpandableListView 的子级的主要内容,如果未能解决你的问题,请参考以下文章

添加的 View 将 RecyclerView 作为父级,但视图不是真正的子级

RecyclerView 与 CardView 作为仪表板或像 Windows Tiles

将水平 RecyclerView 作为项目放置在垂直 RecyclerView 中时的自动滚动问题

RecyclerView详解

recyclerview和listview的区别

如何在 Android 中的 RecyclerView 末尾添加一个加号图像作为按钮? [复制]