Android 创建类似ViewPager的RecyclerView
我使用的是一个ViewPager,其中每个页面都是一个类别,其中包含一个水平循环视图。每个RecyclerView都包含许多与其所在的ViewPager页面类别相关的项目。当然,当用户滚动时,如果包含更多要滚动到的项目,则会滚动到RecyclerView,否则会滚动到下一页/上一页(取决于滚动方向) 我希望这些RecyclerViews充当ViewPager(起初,第一个ViewPager的每个页面都包含另一个ViewPager,但它给了我糟糕的性能): 在每个RecyclerView中,每个“页面”包含9个项目(分为3列),我希望用户只能“逐页”滚动到RecyclerView。这意味着,如果他在第一页,并扔到右边,他将 滚动至“第二页”(其中包含从位置9到17的项目)。此外,用户一次不能滚动超过一页 有没有办法顺利地做到这一点?我认为更简单的方法是使用并覆盖SnapHelper,但我必须承认,我不太确定如何继续实现预期结果Android 创建类似ViewPager的RecyclerView,android,android-viewpager,android-recyclerview,Android,Android Viewpager,Android Recyclerview,我使用的是一个ViewPager,其中每个页面都是一个类别,其中包含一个水平循环视图。每个RecyclerView都包含许多与其所在的ViewPager页面类别相关的项目。当然,当用户滚动时,如果包含更多要滚动到的项目,则会滚动到RecyclerView,否则会滚动到下一页/上一页(取决于滚动方向) 我希望这些RecyclerViews充当ViewPager(起初,第一个ViewPager的每个页面都包含另一个ViewPager,但它给了我糟糕的性能): 在每个RecyclerView中,每个“
谢谢 从描述中,很难准确判断滚动行为应该发生在哪个方向,但以下内容应该让您知道该怎么做: 您可以将
RecyclerView
作为项目嵌套在RecyclerView
中
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// find the item type based on the position
if(rowType == NESTED_LIST_TYPE) {
NestedRecyclerViewHolder viewHolder = (NestedRecyclerViewHolder)holder;
viewHolder.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
viewHolder.recyclerView.setAdapter(new MyAdapter());
// continue to set up the nested `RecyclerView` as you would a regular one
}
...
在适配器的onCreateViewHolder
方法中,根据提供的viewType
返回可选的ViewHolder
。为简洁起见,我将其作为开关
语句来完成
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case REGULAR_ITEM:
return new RegularItemViewHolder(getRowView(parent, R.layout.list_item_regular);
case NESTED_LIST_TYPE:
return new NestedRecyclerViewHolder(getRowView(parent, R.layout.list_item_nested_recycler);
...
}
protected View getRowView(ViewGroup parent, @LayoutRes final int layoutRes) {
return layoutInflater.inflate(layoutRes, parent, false);
}
ViewHolder
public class NestedRecyclerViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.my_nested_recyclerview)
public RecyclerView recyclerView;
public NestedRecyclerViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
然后在onBindViewHolder
中,您可以使用水平LinearLayoutManager
设置此嵌套的RecyclerView
(假设您有一个垂直父级RecyclerView
,您希望其中一个或多个行是水平RecyclerView
)
这将在垂直RecyclerView
中提供水平滚动行为-当然,您可以通过为每个RecyclerView
使用不同的LinearLayoutManager
s来翻转它们,以另一种方式工作
要使其行为类似于ViewPager
,您需要使用您在问题中提到的SnapHelper
:
RecyclerView
适配器中列表项的宽度设置为match\u parent
(在项目的XML布局中执行此操作)LinearSnapHelper
(支持库24.1),如下所示:
SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(viewHolder.recyclerView);
这将提供一种行为,用户一次只能看到一个项目,并允许用户在各个水平视图中翻页。是的,通常嵌套滚动容器(如ScrollView和ViewPager)需要特殊处理,通常将触摸事件委托给父级和子级,具体取决于您的操作。这是一个非常奇怪的实现,我不确定你所认为的可用性是否有效和/或可能,但有一个线索让你开始。那是什么线索?很难想象你想要做什么。它和这个相似吗?