2016-11-20 76 views
0

我正在使用ViewPager,其中每個頁面都是一個包含水平RecyclerView的類別。每個RecyclerView包含許多與它所在的ViewPager頁面類別相關的項目。當然,當用戶滾動時,如果它包含更多項目滾動到滾動到RecyclerView滾動到RecyclerView,否則它滾動到下一個/上一頁(取決於滾動方向)。創建一個像ViewPager一樣的RecyclerView

我想這些RecyclerViews作爲ViewPagers(在第一,ViewPager的每個頁面包含在另一個ViewPager,但它給了我表現不好):

在每RecyclerView,每個「頁面」包含9項目(分爲3列),我希望用戶只能滾動到「逐頁」的RecyclerView。這意味着如果他在第一頁並且向右轉,他會滾動到「第二頁」(其包含從第9位到第17位的項目)。另外,用戶不應該一次能滾動多頁。

有沒有辦法做到這一點順利?我認爲更簡單的方法是使用並重寫SnapHelper,但我必須承認,我不太清楚如何繼續實現預期的結果。

謝謝!

+0

是的,通常像ScrollView和ViewPager這樣的嵌套可滾動容器需要特殊處理,通常根據你在做什麼將觸摸事件委託給父母和孩子。這是一個相當奇怪的實現,我不確定你所想的可用性是否有效和/或可能,但是你有一個線索可以開始。 – Chisko

+0

那是什麼線索? – IKIKN2

+0

很難想象你想要做什麼。是否與此類似:https://stackoverflow.com/q/47514072/878126? –

回答

3

從描述中,這是很難說究竟應該發生的方向滾動的行爲,但下面應該給你做什麼的想法:

可以嵌套內的RecyclerView一個RecyclerView作爲項目。

在適配器的onCreateViewHolder方法中,根據所提供的viewType返回替代方案ViewHolder。爲簡潔起見,我已將其作爲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 S代表每個RecyclerView S在其他的方式來解決。

爲了使它像一個ViewPager,你需要使用SnapHelper,你提到你的問題:

  1. 設置列表項的寬度在嵌套RecyclerView的適配器match_parent (在項目的XML佈局中執行此操作)。
  2. 初始化LinearSnapHelper(支持庫24。1)所示:

    SnapHelper snapHelper = new LinearSnapHelper(); 
    snapHelper.attachToRecyclerView(viewHolder.recyclerView); 
    

這會給你的行爲,其中用戶只能看到一個項目的時間和允許通過單獨的水平視圖的用戶頁面。

相關問題