サブRecyclerviewを含むParent RecyclerViewで構成されるレイアウトがあります
リストを別のリストの中に入れるのは良くないことを知っていますが、スワイプやドラッグアンドドロップなどのサブリスト機能を使用できるようにする必要があります
私の問題は、子供のRecyclerviewがフォーカスを取得し、タッチポイントがその上にある場合は親のスクロールを停止することです子のRecyclerviewリスト項目は左右にスワイプします。これを達成するための助けはありますか?
私は最終的に解決策を見つけました。
カスタムLinearLayoutManagerを作成
public class CustomLinearLayoutManager extends LinearLayoutManager {
public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
// it will always pass false to RecyclerView when calling "canScrollVertically()" method.
@Override
public boolean canScrollVertically() {
return false;
}
}
次に、垂直スクロールのためにこのようにインスタンス化します
CustomLinearLayoutManager customLayoutManager = new CustomLinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);
最後に、カスタムレイアウトをリサイクラビューのレイアウトマネージャーとして設定します
recyclerView.setLayoutManager(customLayoutManager);
ActivityName.Javaで、onCreate()メソッド内に記述します。
RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);
何らかの方法で、コーディネーターレイアウトを使用している場合、物事を単純化したい場合、ネストされたスクロールを無効にしたい場合。
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/activitiesListRV"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
</Android.support.v4.widget.NestedScrollView>
また、同じ原則を適用します。ActivityName.Javaで、onCreate()メソッド内に次のように記述します。
RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);
したがって、基本的にXMLでは、アプリを指定する必要があります:layout_behavior
app:layout_behavior="@string/appbar_scrolling_view_behavior">
リサイクラビューを埋め込むのは良い習慣ではないかもしれませんが、避けられない場合があります。このような何かが動作する可能性があります:
public class NoScrollRecycler extends RecyclerView {
public NoScrollRecycler(Context context){
super(context);
}
public NoScrollRecycler(Context context, AttributeSet attrs){
super(context, attrs);
}
public NoScrollRecycler(Context context, AttributeSet attrs, int style){
super(context, attrs, style);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
//Ignore scroll events.
if(ev.getAction() == MotionEvent.ACTION_MOVE)
return true;
//Dispatch event for non-scroll actions, namely clicks!
return super.dispatchTouchEvent(ev);
}
}
これにより、スクロールイベントは無効になりますが、クリックイベントは無効になりません。 「子」RecyclerViewにこのクラスを使用します。親のリサイクラービューはスクロールしますが、子はスクロールしません。親は標準のRecyclerViewにすぎませんが、子はスクロールのないこのカスタムのものになりますが、クリックは処理します。親のRecyclerViewのクリックを無効にする必要があるかもしれません。これをテストしていないので、よくわかりません。
また、これをXMLで使用するには(知らなかった場合)、次の手順を実行します。
<com.yourpackage.location.NoScrollRecycler
...
... >
...
...
</com.yourpackage.location.NoScrollRecycler>
_Android:nestedScrollingEnabled="false"
_が子RecyclerViewにある
あなたは付け加えられます
_Android:nestedScrollingEnabled="false"
_
xMLでご使用のRecyclerViewまたは
_childRecyclerView.setNestedScrollingEnabled(false);
_
javaでRecyclerViewに。
編集:-
childRecyclerView.setNestedScrollingEnabled(false);
は、Android_version> 21デバイスでのみ機能します。すべてのデバイスで動作するには、次を使用します
_ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
_
sub RecyclerView
でsetNestedScrollingEnabled(false);
を使用すると、sub RecyclerView
内でのスクロールが停止します。
私の場合、コードは
mInnerRecyclerView.setNestedScrollingEnabled(false);
ここで、mInnerRecyclerView
は内部RecyclerView
です。
私は遅すぎると思いますが、ここでそれがまだ迷惑な場合は解決策を見つけました:
RecyclerView v = (RecyclerView);
findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);
sensorsRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
私は多くの提案された解決策を試してみましたが、私の場合に機能するものを見つけることができませんでした。 GridLayoutManagerを使用して、ScrollView内に複数のRecyclerViewがあります。上記の提案の結果、ScrollViewは指を持ち上げるたびにスクロールを停止しました(RecyclerViewの上で指を持ち上げると、ビューの上部または下部に移動しませんでした)
RecyclerViewソースを見ると、onTouchEvent内にレイアウトマネージャーへの呼び出しがあります:
final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();
カスタムレイアウトマネージャーでこれらをオーバーライドした場合、falseを返すとスクロールが停止します。また、ScrollViewが突然スクロールを停止する問題を修正します。
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/rv"
Android:layout_marginTop="2dp"
Android:layout_marginLeft="2dp"
Android:layout_marginBottom="10dp"
Android:layout_marginRight="2dp"
Android:nestedScrollingEnabled="false"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
/>
</RelativeLayout>
linnerレイアウト内にコードを配置します...実用的に何もする必要はありません
カスタムビューを作成したくない場合は、RecyclerViewの前に同じサイズのレイアウトを作成し、クリック可能にすることもできます。
編集:しかし、残念ながらリストアイテムのイベントもブロックします。