RecyclerView(水平)内部 RecyclerView(水平)内部 RecyclerView(垂直)

RecyclerView (Horizontal) inside RecyclerView (Horizontal) inside RecyclerView (Vertical)

基本上我正在尝试实现与所附照片类似的效果。动物类别列表(垂直滚动),其中包含一些动物列表(水平滚动),并且在每个动物卡片中都有一个描述列表(水平滚动)。

我没有使用任何 ScrollView,只使用了来自三个 RecyclerView 的给定滚动。

我想滚动橙色卡片和照片卡片动物以保持修复。但是卷轴只能移动动物卡,不能移动橙色卡。如果我为每张橙色卡片设置一个点击侦听器,它将把我带到给定的屏幕。

我在其他应用程序上看到水平滚动内部的水平滚动,所以可以实现,但我想我错过了什么。

我也看到了这个问题的多种形式,但似乎没有答案。

假设我有三个 类,它们包含:

AnimalCategory - 动物名称和列表

动物 - 照片、文字和描述列表

描述 - 属性 字段

在activity中:

...

animalsAdapter.addCategory(new AnimalCategory(
                                animalCategoryList.get(i).getName(),
                                animalCategoryList.get(i).getAnimals()));

animalsRecyclerView.setAdapter(animalsAdapter);

...

在动物类别适配器中:

holder.categoryTextView.setText(categoryName);
holder.categoriesRecyclerView.setLayoutManager(new LinearLayoutManager(holder.categoriesRecyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
holder.categoriesRecyclerView.setAdapter(new AnimalsAdapter(animalsCategory.getAnimals(), context));

在动物适配器中:

holder.categoriesRecyclerView.setLayoutManager(new LinearLayoutManager(holder.categoriesRecyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
holder.categoriesRecyclerView.setAdapter(new AnimalAdapter(animalCategory.getAnimals(), context);

在描述中:

Description description = descriptionList.get(position);
holder.propertyTextView.setText(description.getProperty());

在您定义水平回收视图(比方说 descriptionRecyclerView)的位置添加以下内容。当触摸到该 recyclerview 区域时,这将忽略父 recyclerview 的滚动,并控制滚动。

RecyclerView.OnItemTouchListener mScrollTouchListener = new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
                rv.getParent().requestDisallowInterceptTouchEvent(true);
                break;
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { }
    };

descriptionRecyclerView.addOnItemTouchListener(mScrollTouchListener);

这是一个糟糕的用户体验, 许多嵌套的滚动视图很难与之交互,

您应该在不同的屏幕中拆分数据, 或者只是减少每个布局显示的数据,这样您就不必滚动, 然后在用户点击并打开新的详细信息屏幕时再次显示详细信息

或者您可以使用可扩展列表项来显示更多数据