Java 如何使RecyclerView不可单击并将onClick事件传递给父视图?
是否可以使Java 如何使RecyclerView不可单击并将onClick事件传递给父视图?,java,android,android-layout,android-recyclerview,Java,Android,Android Layout,Android Recyclerview,是否可以使回收视图不可点击?我之所以要这样做,是因为我的RecyclerView只在可点击的卡片视图中显示一些小图标。因此,如果有人点击图标,它只需点击(并设置动画)父级cardwiew 我尝试了以下方法: recyclerView.setClickable(假) recyclerView.setFocusable(false) 扩展RecyclerView并使onTouchEvent(MotionEvent)返回false 使用上述方法3并使用itemView.setClickable(fal
回收视图
不可点击?我之所以要这样做,是因为我的RecyclerView
只在可点击的卡片视图中显示一些小图标。因此,如果有人点击图标,它只需点击(并设置动画)父级cardwiew
我尝试了以下方法:
recyclerView.setClickable(假)代码>
recyclerView.setFocusable(false)代码>
RecyclerView
并使onTouchEvent(MotionEvent)
返回false
itemView.setClickable(false)代码>在RecyclerView
适配器中。如果成功,单击将发送到父级。但是,现在,RecyclerView
不再可滚动
clickable=“false”
,focusable=“false”
,focusableInTouchMode=“false”
。(见评论@Ibrahim)recyclerView#setlayoutfreezed(true)
和itemView.setClickable(false)代码>。这是可行的,但与#4的问题相同
RecyclerView
的单击事件传递到父视图吗?请注意,RecyclerView
仍然需要可滚动(水平)
编辑:
用户建议将OnClick侦听器设置为图标,然后将单击“重定向”到父级的单击操作。这会起作用,但在父视图上不会出现单击动画。如果有人在itemView外部单击,但仍在
RecyclerView
(例如itemView)内部,则不会检测到单击。不幸的是,这不是一个解决方案。我也有同样的问题,在我尝试了更多的东西之后,我在recyclerview上使用了更多的布局
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layoutwidth="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
在那之后,你就可以看到“线性布局”了。
这是100%有效的。我处理这类事情的首选方法是从适配器连接一个侦听器,当单击回收器视图中的每个图标时,将调用该侦听器。然后,您的活动可以以适当的方式进行响应。例如:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private MyAdapterListener mListener;
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.iconClicked();
}
});
}
public void setListener(MyAdapterListener listener) {
mListener = listener;
}
public interface MyAdapterListener {
void iconClicked();
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{
私人MyAdapterListener;
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mListener.iconClicked();
}
});
}
公共void setListener(MyAdapterListener侦听器){
mListener=监听器;
}
公共接口MyAdapterListener{
void iconClicked();
}
}
然后在活动中,您只需创建MyAdapterListener的实例,并将其设置为Recycler视图的适配器的侦听器。然后,当触发
iconClicked()
函数时,执行将在父级单击时执行的代码。您应该扩展父级视图并拦截单击,以便recyclerview不会收到它
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
归功于:适配器的代码是什么?@VladoPandžić适配器真的没有什么特别之处。它会像正常情况一样对布局进行充气。
onBindViewHolder(…)
中唯一的代码是设置一个可绘制到ImageView
。您是否尝试在膨胀的布局xml中设置可点击的
、可聚焦的
和FocusableTouchMode false?@Ibrahim刚刚尝试过,没有效果。还尝试了clickable=“false”、FocusableTouchMode=“false”、FocusableTouchMode=“错在“回收xml”上,并提供“回收”视图。如果可用,请单击“实现”如何工作?你能解释一下这是如何解决这个问题的吗?当你想让RecyclerViewDesable时,你可以让LinearLayout可见,当LinearLayout可用时,recyclerview将不工作,然后你可以让LinearLayout启用recyclerview。好的,我明白,但这不是我的问题。我的问题是如何禁用RecyclerView
并将单击传递到父视图。我还注意到,RecyclerView
仍然需要滚动。如果我只是想禁用RecyclerView
,我可以在RecyclerView
和itemView
上使用setEnabled(false)
,但是单击不会传递到父布局。你能上传你的xml吗“我会给出正确的回答。@ThomasVos这是有效的,因为线性布局掩盖了整个recyclerview,并接收点击。谢谢你的回答。这将起作用,但在父视图上不会出现单击动画。另外,如果有人在项目视图
之外单击,会怎么样?我应该如何处理单击?请查看我问题的编辑部分。如果您修改itemView,使它们在recycler视图中没有任何间距,而是在itemView内部有填充,则itemView将填充recyclerView,从而无法单击recyclerView,而不是项目视图。如果您正在做一些其他的事情,使这不可行,您可能需要分享您的布局,以便我们可以进一步帮助您。就我个人而言,我发现这种方法通常也会带来更好的布局(甚至是单元格之间的间距)。问题不在于ItemView之间有空间。正如您所说,我可以通过在itemView布局中使用填充来解决这个问题。问题是,如果只有几个“图标”,那么就不会使用整个RecyclerView,而且还有空间。我无法将RecyclerView设置为包装内容,因为它需要位于其他两个视图之间。所以我认为你的回答对我的情况不起作用。有其他解决方案的想法吗?你能分享你的布局吗?这是最好的解决方案。它应该被标记为Answer不会