web-dev-qa-db-fra.com

Comment désactiver les éléments RecyclerView en cliquant dessus

J'utilise un bouton d'action flottant. Je veux désactiver Recyclerview Items from Click lorsque j'appuie sur le bouton FAB. J'ai essayé cette méthode mais ne fonctionne pas setClickable(true);

Ma mise en page

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:fab="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:background="#fff"
    tools:context="com.hartwintech.socialchat.activity.IconTabsActivity">

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/recycler_view"
        Android:scrollbars="vertical"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >

    </Android.support.v7.widget.RecyclerView>

    <com.github.clans.fab.FloatingActionMenu
        Android:id="@+id/floatmenu"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentRight="true"
        Android:layout_marginBottom="60dp"
        Android:layout_marginRight="16dp"
        fab:fab_showAnimation="@anim/show_from_bottom"
        fab:fab_hideAnimation="@anim/hide_to_bottom"
        fab:menu_labels_style="@style/MenuLabelsStyle"
        fab:menu_shadowColor="#444"
        fab:menu_colorNormal="#FFB805"
        fab:menu_colorPressed="#F2AB00"
        fab:menu_colorRipple="#D99200"/>

</RelativeLayout>

Java Class

floatMenu.setOnMenuToggleListener(new FloatingActionMenu.OnMenuToggleListener() {
            @Override
            public void onMenuToggle(boolean opened) {
                if (opened) {
                    final int color = R.color.transp;
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        mrecyclerview.setClickable(false);
                        mrecyclerview.setEnabled(false);
                        mrecyclerview.setForeground(new ColorDrawable(ContextCompat.getColor(getContext(), color)));
                    }
                } else {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        mrecyclerview.setClickable(true);
                        mrecyclerview.setEnabled(true);
                        mrecyclerview.setForeground(null);
                    }
                }
            }
        });
6
Dev Tamil

Vous pouvez ajouter un simple booléen à votre adaptateur comme ceci:

public boolean isClickable = true;

et le mettre dans votre fab-click:

mAdapter.isClickable = true/false;

Et dans votre OnClickListener de l'adaptateur, n'agissez que s'il est cliquable:

public void onClick(View view) {
    if(!isClickable)
        return;
    // do your click stuff
}
20
Björn Kechel

Pour désactiver RecyclerView, suivez les étapes ci-dessous:

1. Ajoutez la vue suivante dans votre fichier de mise en page,

        <View
            Android:id="@+id/viewDisableLayout"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="#40000000"
            Android:clickable="true"
            Android:focusable="true"
            Android:visibility="gone"/>

2. Définissez View Visibility `View.VISIBLE lorsque vous souhaitez désactiver RecyclerView 

6
Rajan

Vous devez définir l'écouteur de clic sur chaque FloatingActionButton.

voir ce numéro sur bibliothèque

1
N J

La réponse de Björn Kechel m'aide. Comme il l'a dit, je viens d'ajouter Boolean. Lorsque je clique sur le menu fab, le booléen est activé. Ensuite, écrivez la condition sur mrecyclerview.addOnItemTouchListener
Java Class

    public Boolean fabClick = false;

    floatMenu.setOnMenuToggleListener(new FloatingActionMenu.OnMenuToggleListener() {
                @Override
                public void onMenuToggle(boolean opened) {
                    if (opened) {
                        final int color = R.color.transp;
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            fabClick = true;
                            mrecyclerview.setClickable(false);
                            mrecyclerview.setEnabled(false);
                            mrecyclerview.setForeground(new ColorDrawable(ContextCompat.getColor(getContext(), color)));
                        }
                    } else {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                               
                            fabClick = false;
                            mrecyclerview.setClickable(true);
                            mrecyclerview.setEnabled(true);
                            mrecyclerview.setForeground(null);
                        }
                    }
                }
            });


            mrecyclerview.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), mrecyclerview, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                if(!fabClick) {
                    Android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.setCustomAnimations(R.anim.fragment_anim_start, R.anim.fragment_anim_stop);
                    Intent i = new Intent(getActivity(), Group_Chat_Screen.class);
                    startActivity(i);
                }
            }
1
Dev Tamil

Solution de travail avec RecyclerView.OnItemTouchListener:

@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("itemsClickable")
fun setRecyclerViewClickable(view: RecyclerView, clickable: Boolean) {
    view.isEnabled = clickable
    if (!clickable) {
        val itemTouchListener = object : RecyclerView.OnItemTouchListener {
            override fun onTouchEvent(rv: RecyclerView?, e: MotionEvent?) {

            }

            override fun onInterceptTouchEvent(rv: RecyclerView?, e: MotionEvent?): Boolean {
                return rv?.isEnabled == false
            }

            override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {

            }

        }
        view.addOnItemTouchListener(itemTouchListener)
        view.tag = itemTouchListener
    } else {
        (view.tag as? RecyclerView.OnItemTouchListener)?.let {
            view.requestDisallowInterceptTouchEvent(true)
            view.removeOnItemTouchListener(it)
        }
    }
}
1
danaimset

Vous pouvez simplement utiliser la récursivité pour désactiver/activer les clics sur l'affichage.

 public static void setClickable(View view, boolean clickable) {
        if (view != null) {
            if (view instanceof ViewGroup) {
                ViewGroup viewGroup = (ViewGroup) view;
                for (int i = 0; i < viewGroup.getChildCount(); i++) {
                    setClickable(viewGroup.getChildAt(i), clickable);
                }
            }
            view.setClickable(clickable);
        }
    }
1
Roman