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);
这是一个糟糕的用户体验,
许多嵌套的滚动视图很难与之交互,
您应该在不同的屏幕中拆分数据,
或者只是减少每个布局显示的数据,这样您就不必滚动,
然后在用户点击并打开新的详细信息屏幕时再次显示详细信息
或者您可以使用可扩展列表项来显示更多数据
基本上我正在尝试实现与所附照片类似的效果。动物类别列表(垂直滚动),其中包含一些动物列表(水平滚动),并且在每个动物卡片中都有一个描述列表(水平滚动)。
我没有使用任何 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);
这是一个糟糕的用户体验, 许多嵌套的滚动视图很难与之交互,
您应该在不同的屏幕中拆分数据, 或者只是减少每个布局显示的数据,这样您就不必滚动, 然后在用户点击并打开新的详细信息屏幕时再次显示详细信息
或者您可以使用可扩展列表项来显示更多数据