创建一个像ViewPager

时间:2016-11-20 20:30:07

标签: android android-viewpager android-recyclerview

我正在使用一个ViewPager,其中每个页面都是一个包含水平RecyclerView的类别。每个RecyclerView包含许多与其所在的ViewPager页面类别相关的项目。当然,当用户滚动时,如果它包含更多要滚动的项目,它会滚动到RecyclerView,否则,它会滚动到下一个/上一页(取决于滚动方向)。

我希望这些RecyclerViews充当ViewPagers(起初,第一个ViewPager的每个页面都包含另一个ViewPager,但它给了我糟糕的表现):

在每个RecyclerView中,每个“页面”包含9个项目(列在3列中),我希望用户只能“逐页”滚动到RecyclerView。这意味着,如果他在第一页并向右倾斜,他就会 滚动到“第二页”(其中包含从位置9到17的项目)。此外,用户不应该一次滚动多个页面。

有没有办法顺利完成?我认为更简单的方法是使用和覆盖SnapHelper,但我必须承认,我不太确定如何继续实现预期的结果。

谢谢!

1 个答案:

答案 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

  1. 将嵌套match_parent的适配器中列表项的宽度设置为LinearSnapHelper(在项目的XML布局中执行此操作)。
  2. 初始化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);
    
  3. 这将为您提供一种行为,即用户一次只能看到一个项目并允许用户翻阅各个水平视图。