Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使RecyclerView不可单击并将onClick事件传递给父视图?_Java_Android_Android Layout_Android Recyclerview - Fatal编程技术网

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
  • 使用上述方法3并使用
    itemView.setClickable(false)
    RecyclerView
    适配器中。如果成功,单击将发送到父级。但是,现在,
    RecyclerView
    不再可滚动
  • 在膨胀的列表项XML中设置
    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不会