我正在使用一个ViewPager,其中每个页面都是一个包含水平RecyclerView的类别。每个RecyclerView包含许多与其所在的ViewPager页面类别相关的项目。当然,当用户滚动时,如果它包含更多要滚动的项目,它会滚动到RecyclerView,否则,它会滚动到下一个/上一页(取决于滚动方向)。
我希望这些RecyclerViews充当ViewPagers(起初,第一个ViewPager的每个页面都包含另一个ViewPager,但它给了我糟糕的表现):
在每个RecyclerView中,每个“页面”包含9个项目(列在3列中),我希望用户只能“逐页”滚动到RecyclerView。这意味着,如果他在第一页并向右倾斜,他就会 滚动到“第二页”(其中包含从位置9到17的项目)。此外,用户不应该一次滚动多个页面。
有没有办法顺利完成?我认为更简单的方法是使用和覆盖SnapHelper,但我必须承认,我不太确定如何继续实现预期的结果。
谢谢!
答案 0 :(得分:3)
从描述中,很难告诉完全滚动行为应该朝哪个方向发生,但以下内容应该让您知道该怎么做:
您可以将RecyclerView
作为项目嵌套在RecyclerView
。
在适配器的onCreateViewHolder
方法中,根据提供的ViewHolder
返回备用viewType
。为简洁起见,我将此作为switch
语句完成。
@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
中,您可以使用水平RecyclerView
设置此嵌套LinearLayoutManager
(假设您有一个垂直父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
}
...
)。
RecyclerView
这将在垂直LinearLayoutManager
中提供水平滚动行为 - 当然,您可以通过为每个RecyclerView
使用不同的ViewPager
来翻转它们以相反的方式工作第
要使其行为与SnapHelper
相同,您需要在问题中使用RecyclerView
:
match_parent
的适配器中列表项的宽度设置为LinearSnapHelper
(在项目的XML布局中执行此操作)。初始化SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(viewHolder.recyclerView);
(支持库24.1),如下所示:
void WriteToFile(std::ofstream fstream, unsigned int count, WORD hour, WORD minute, unsigned char result);
这将为您提供一种行为,即用户一次只能看到一个项目并允许用户翻阅各个水平视图。