2016-11-20 5 views
0

私は、各ページが水平RecyclerViewを含むカテゴリであるViewPagerを使用しています。各RecyclerViewには、それが入っているViewPagerのページのカテゴリに関連したいくつかの項目が含まれています。もちろん、ユーザがスクロールすると、スクロールするアイテムが多く含まれている場合はRecyclerViewにスクロールし、そうでない場合は、前のページ(スクロール方向に応じて)ViewPagerのように動作するRecyclerViewの作成

私はこれらのRecyclerViewsはViewPagers(最初に、最初のViewPagerの各ページが別のViewPagerが含まれていますが、それは私に悪いパフォーマンスを与えた)として機能したいと思います。各RecyclerViewで

、各「ページ」9が含まれていますアイテム(3列にレイアウトされています)を表示し、ユーザーがRecyclerViewに「ページ単位で」スクロールできるようにしたいと思います。つまり、彼が最初のページにいて、右に飛んでいれば、 は「第2ページ」(位置9から17の範囲のアイテムを保持する)にスクロールします。また、一度に複数のページをスクロールすることはできません。

これをスムーズに行う方法はありますか?スナップヘルパーを使用してオーバーライドする方が簡単な方法だと思いますが、期待した結果を達成するためにどのように進めるべきかについてはまだわかりません。

ありがとうございます!説明から

+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に、あなたは、水平LinearLayoutManagerと、このネストされた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 
} 
... 

これは垂直RecyclerViewに水平スクロール動作を提供します - もちろん、あなたはRecyclerView秒ごとに異なるLinearLayoutManager Sを使用して周りに他の方法で動作するようにこれらを反転させることができます。

それはViewPagerのように振る舞うようにするには、あなたがあなたの質問に示唆したようにSnapHelperを使用する必要があるだろう:

  1. match_parentに入れ子にRecyclerViewのアダプタのリスト項目の幅を設定します。 (アイテムのXMLレイアウトでこれを行います)。
  2. LinearSnapHelper(サポートライブラリ24)を初期設定します。1)このように:

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

これは、あなたのユーザーは一度に一つの項目を参照し、個々の水平方向のビューをページにユーザーを許可することができます動作を提供します。

関連する問題