Как отключить нажатие элементов RecyclerView

Я использую плавающую кнопку действия. Я хочу отключить элементы Recyclerview от щелчка, когда я нажимаю кнопку FAB. Я попробовал этот метод, но он не работает setClickable(true);

Мой макет

<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

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

person Dev Tamil    schedule 24.01.2017    source источник
comment
вы хотите отключить или включить? setClickable(true); сделает его кликабельным   -  person N J    schedule 24.01.2017
comment
я хочу отключить   -  person Dev Tamil    schedule 24.01.2017
comment
попробуй mrecyclerview.setEnabled(false);   -  person N J    schedule 24.01.2017
comment
Старался бро. это не отключает   -  person Dev Tamil    schedule 24.01.2017
comment
можешь выложить свой макет   -  person N J    schedule 24.01.2017
comment
отправил проверку ответа...   -  person N J    schedule 24.01.2017


Ответы (9)


Вы можете добавить простое логическое значение в свой адаптер следующим образом:

public boolean isClickable = true;

и установите его в свой сказочный клик:

mAdapter.isClickable = true/false;

И в вашем OnClickListener в адаптере действуйте только тогда, когда он доступен для клика:

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

Чтобы отключить RecyclerView, выполните следующие действия:

1. Добавьте следующий вид в файл макета,

        <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. Установите View Visibility `View.VISIBLE, если вы хотите отключить RecyclerView еще

person Rajan    schedule 10.02.2018
comment
Хорошо сыграл @Rajan, ты делал самые грязные вещи, но это сработало. - person Skizo-ozᴉʞS; 06.06.2018
comment
Хороший! Я пробовал это самостоятельно, но мне не хватало части android:clickable=true android:focusable=true ```! Спасибо гений! :) - person Mohamed Hamdaoui; 19.12.2019

Вы можете просто использовать рекурсию, чтобы отключить/включить клики при просмотре

 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);
        }
    }
person Roman    schedule 14.06.2018

Вам нужно установить прослушиватель кликов на каждый FloatingActionButton.

см. этот выпуск в библиотеке

person N J    schedule 24.01.2017
comment
Проблема связана с FloatingActionButton. Но я хочу отключить щелчок recyclerview при нажатии FloatingActionMenu - person Dev Tamil; 25.01.2017
comment
затем вы можете поместить вид поверх RecyclerVIew, чтобы он исчез, и не забудьте добавить setClickable="true" к этому перекрывающемуся виду - person N J; 25.01.2017
comment
Я отправил ответ, братан. Спасибо за поддержку. - person Dev Tamil; 25.01.2017

Ответ Бьорна Кехеля помогает мне. Как он сказал, я только что добавил Boolean. Когда я нажимаю потрясающее меню, активируется логическое значение. Затем нужно написать условие на 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);
                }
            }
person Dev Tamil    schedule 25.01.2017

Рабочее решение с 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)
        }
    }
}
person danaimset    schedule 09.08.2018

Вы можете отключить прикосновение recyclerview

recyclerView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return true;
                }
            });
person Van Tung    schedule 17.08.2019

  1. В XML-файле задайте layout_width и layout_height для FloatingActionMenu как match_parent и установите clickable как false :

        android:layout_width="match_parent "
        android:layout_height="match_parent "
        android:clickable="false"
    
  2. В вашем классе Java

    floatMenu.setOnMenuToggleListener(new FloatingActionMenu.OnMenuToggleListener() {
            @Override
            public void onMenuToggle(boolean opened) {
                if (opened) {
                   floatMenu.setClickable(true);
                } else {
                     floatMenu.setClickable(false);
                }
            }
        });
    

Это должно работать.

person AE.It'sMe    schedule 06.12.2019

Я решил эту проблему с очень простой логикой. Это предотвратит двойной щелчок по одному элементу, а также по нескольким элементам RecyclerView.

Объявите переменную в своей деятельности.

private long mLastClickTime = 0;

Затем используйте в любом OnClickListener.

@Override
public void onClick(View v) {
    if(SystemClock.elapsedRealtime() - mLastClickTime < 1000){//You can reclick after 1 second
        return;//Before 1 seconds from first click this onclick will return from here
    }
    mLastClickTime = SystemClock.elapsedRealtime();
    
    //Do stuff here

}

На самом деле я нашел это решение в потоке стека, когда искал предотвращение двойного щелчка по кнопке. Я пишу эту строку, чтобы подтвердить, что фактический ответ опубликован кем-то (к сожалению, я не могу найти этот ответ, чтобы связать его / ее ответ здесь.)

Надеюсь, это решит вашу проблему. :)

person GauravSaini    schedule 19.08.2020