如何使 recyclerView_items 不可点击,而其中一个被点击并起作用?
How to make recyclerView_items unclickable, while one of them is clicked and working?
前提
我的每个 RecyclerView_items 显示一个图像,并在点击时更改其 image_resource。
其中一个是正确答案,它具有附加功能:在更改图像后 5 秒导航到另一个片段。
基本上RecyclerView_items的clickListener的功能是
- 错误的项目
单击 -> 更改 image_resource
- 正确的项目
单击 -> 更改 image_resource -> delay(5000)
-> 导航到另一个片段
问题
然后,我的问题是点击 right_item 后,在 delay(5000)
期间可以点击其他项目。
我不希望他们在 delay(5000)
期间更改图像。
怎么做?!提前致谢。
您可以使用的简单技巧是制作 FrameLayout
或 View
重叠在 RecyclerView
上。将列表 visibility
设置为 GONE
。然后在 activity 或可以访问此 FrameLayout
或重叠视图的片段中,在此视图上添加一个空 OnClickListener
。
*viewId*.setOnClickListener { }
现在调用 delay 时将其 visibility
设置为 VISIBLE
。当延迟再次完成时,将其 visibility
设置为 GONE
您可以通过在用户单击右侧图像时添加一个标志然后将该变量设置为 false 来实现此目的。因此,在移动到下一个片段之前的延迟之后再次使其成为真。
boolean flag = true;
然后在你的项目点击方法
view.setOnClickListner {
if (flag) {
if (rightimageclicked) {
flag = false;
delay {
flag = true;
// Move to other fragment
}
} else {
// change the image for wrong click
}
}
}
这是我的理解,当您处于 delay(5000)
时,您想锁定整个屏幕(使所有项目或按钮不可点击)。
这就是我要做的,在回收器视图 之上提供一个 CLICKABLE 叠加视图并切换其可见性。
我使用相同的方法锁定整个屏幕,同时制作 API呼叫.
view_overlay.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:clickable="true"
android:focusable="true"
android:elevation="5dp"
android:visibility="invisible">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@android:color/transparent"
android:indeterminateTint="@android:color/transparent" />
</RelativeLayout>
显然,您可以将 ProgressBar 替换为 View 以获得透明视图。
要将其包含在主视图中,请将其放在父布局的底部或回收器视图下方。无论您选择哪个,请确保您在回收站视图之上有叠加视图。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
...
...
<include layout="@layout/view_overlay" />
</RelativeLayout>
前提
我的每个 RecyclerView_items 显示一个图像,并在点击时更改其 image_resource。
其中一个是正确答案,它具有附加功能:在更改图像后 5 秒导航到另一个片段。
基本上RecyclerView_items的clickListener的功能是
- 错误的项目
单击 -> 更改 image_resource - 正确的项目
单击 -> 更改 image_resource ->delay(5000)
-> 导航到另一个片段
问题
然后,我的问题是点击 right_item 后,在 delay(5000)
期间可以点击其他项目。
我不希望他们在 delay(5000)
期间更改图像。
怎么做?!提前致谢。
您可以使用的简单技巧是制作 FrameLayout
或 View
重叠在 RecyclerView
上。将列表 visibility
设置为 GONE
。然后在 activity 或可以访问此 FrameLayout
或重叠视图的片段中,在此视图上添加一个空 OnClickListener
。
*viewId*.setOnClickListener { }
现在调用 delay 时将其 visibility
设置为 VISIBLE
。当延迟再次完成时,将其 visibility
设置为 GONE
您可以通过在用户单击右侧图像时添加一个标志然后将该变量设置为 false 来实现此目的。因此,在移动到下一个片段之前的延迟之后再次使其成为真。
boolean flag = true;
然后在你的项目点击方法
view.setOnClickListner {
if (flag) {
if (rightimageclicked) {
flag = false;
delay {
flag = true;
// Move to other fragment
}
} else {
// change the image for wrong click
}
}
}
这是我的理解,当您处于 delay(5000)
时,您想锁定整个屏幕(使所有项目或按钮不可点击)。
这就是我要做的,在回收器视图 之上提供一个 CLICKABLE 叠加视图并切换其可见性。
我使用相同的方法锁定整个屏幕,同时制作 API呼叫.
view_overlay.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:clickable="true"
android:focusable="true"
android:elevation="5dp"
android:visibility="invisible">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@android:color/transparent"
android:indeterminateTint="@android:color/transparent" />
</RelativeLayout>
显然,您可以将 ProgressBar 替换为 View 以获得透明视图。
要将其包含在主视图中,请将其放在父布局的底部或回收器视图下方。无论您选择哪个,请确保您在回收站视图之上有叠加视图。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
...
...
<include layout="@layout/view_overlay" />
</RelativeLayout>