点击项后禁用 RecyclerView

3
我有一个包含简单复选框的RecyclerView。下方有一个Done按钮,点击后会启动API调用并发送所有被用户勾选的项目。问题是,在API调用返回(自然)和活动完成之间存在轻微延迟,这允许用户快速点击任意一个复选框。
是否有一种方法可以禁用RecyclerView的触摸事件以防止此情况发生?我已经尝试了回调函数,但在点击Done按钮时没有效果。
mRecyclerViewList.setClickable(false);
mRecyclerViewList.setEnabled(false);

我不想使用onBindViewHolder方法来禁用每个条目,因为那意味着重新加载整个RecyclerView以强制执行该方法。
3个回答

7

在RecyclervView上放置一个空的、可点击的透明视图来捕获点击事件。当你的API返回时,将其可见性设置为“gone”。

样例布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="50dp"
    android:background="#FFFFFFFF"
    android:orientation="horizontal">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:paddingBottom="16dp"
        android:paddingTop="16dp" />

    <View
        android:id="@+id/overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:visibility="gone" />
</FrameLayout>

在代码的某个地方

    // Block clicks on RecyclerView. overlay will consume clicks.
    findViewById(R.id.overlay).setVisibility(View.VISIBLE);

    // Re-enable clicks on RecyclerView
    findViewById(R.id.overlay).setVisibility(View.GONE);

1
android:clickable="true" 很重要 - Amit
如果想在没有可点击的RecyclerView项的情况下继续使用RecyclerView滚动事件,该怎么办? - Durul Dalkanat

3

实际上,您应该遍历 Recycler View 的所有子项并将它们禁用。这是一个使用 Kotlin KTX 的简短方法。

recyclerview.forEachIndexed { _, view ->
     view.isEnabled = false
}

不确定为什么必须使用forEachIndexed,但无论如何这似乎不起作用。 - niall8s
@niall8s正在使用Kotlin和Jetpack扩展。来自androidx.core.view.ViewGroup.forEachIndexed内联函数的方法forEachIndexed。 - dphans

-1

将该活动的launchMode设置为"SingleTop"。这样应该就可以了。

<activity android:name=".SomeActivity"
 android:launchMode="singleTop">
</activity>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接