web-dev-qa-db-ja.com

子Recyclerviewでのスクロールを無効にするandroid

サブRecyclerviewを含むParent RecyclerViewで構成されるレイアウトがあります

リストを別のリストの中に入れるのは良くないことを知っていますが、スワイプやドラッグアンドドロップなどのサブリスト機能を使用できるようにする必要があります

私の問題は、子供のRecyclerviewがフォーカスを取得し、タッチポイントがその上にある場合は親のスクロールを停止することです子のRecyclerviewリスト項目は左右にスワイプします。これを達成するための助けはありますか?

16

私は最終的に解決策を見つけました。

カスタム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);
41

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">
15
Ibrahim Tolaj

リサイクラビューを埋め込むのは良い習慣ではないかもしれませんが、避けられない場合があります。このような何かが動作する可能性があります:

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>
15
Lucas Crawford

_Android:nestedScrollingEnabled="false"_が子RecyclerViewにある

あなたは付け加えられます

_Android:nestedScrollingEnabled="false"
_

xMLでご使用のRecyclerViewまたは

_childRecyclerView.setNestedScrollingEnabled(false);
_

javaでRecyclerViewに。

編集:-

childRecyclerView.setNestedScrollingEnabled(false);は、Android_version> 21デバイスでのみ機能します。すべてのデバイスで動作するには、次を使用します

_ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
_
11
jafarbtech

sub RecyclerViewsetNestedScrollingEnabled(false);を使用すると、sub RecyclerView内でのスクロールが停止します。

私の場合、コードは

mInnerRecyclerView.setNestedScrollingEnabled(false);ここで、mInnerRecyclerViewは内部RecyclerViewです。

3
vijay kumar

私は遅すぎると思いますが、ここでそれがまだ迷惑な場合は解決策を見つけました:

    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;
        }
    });
1
Waged

私は多くの提案された解決策を試してみましたが、私の場合に機能するものを見つけることができませんでした。 GridLayoutManagerを使用して、ScrollView内に複数のRecyclerViewがあります。上記の提案の結果、ScrollViewは指を持ち上げるたびにスクロールを停止しました(RecyclerViewの上で指を持ち上げると、ビューの上部または下部に移動しませんでした)

RecyclerViewソースを見ると、onTouchEvent内にレイアウトマネージャーへの呼び出しがあります:

final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();

カスタムレイアウトマネージャーでこれらをオーバーライドした場合、falseを返すとスクロールが停止します。また、ScrollViewが突然スクロールを停止する問題を修正します。

1
Aidanvii
 <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レイアウト内にコードを配置します...実用的に何もする必要はありません

1
sunil rana

カスタムビューを作成したくない場合は、RecyclerViewの前に同じサイズのレイアウトを作成し、クリック可能にすることもできます。

編集:しかし、残念ながらリストアイテムのイベントもブロックします。

0
KinoP