Android 在RecyclerView外部单击以隐藏RecyclerView行中的子视图

Android 在RecyclerView外部单击以隐藏RecyclerView行中的子视图,android,android-recyclerview,Android,Android Recyclerview,我有一个简单的RecyclerView,当您在RecyclerView中长按一行时,我会在该行上显示一个隐藏的LinearLayout。要在mypublic override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup父级,int-viewType)中执行此操作,我使用以下命令 LinearLayout REACTION_LAYOUT = RecyclerItem.FindViewById<LinearLayout>(Re

我有一个简单的
RecyclerView
,当您在
RecyclerView
中长按
一行时,我会在该行上显示一个隐藏的
LinearLayout
。要在my
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup父级,int-viewType)中执行此操作,我使用以下命令

LinearLayout REACTION_LAYOUT = RecyclerItem.FindViewById<LinearLayout>(Resource.Id.reaction_layout);
RecyclerItem.LongClick += (sender, e) => { OnLongClick(REACTION_LAYOUT); };
这是预期的,现在我想要的是当用户触摸行外的任何位置时隐藏
反应\u布局
,这意味着在RecyclerView中的其他行或其他任何位置

我该怎么做

我尝试使用的方法是在我的适配器的
OnCreateViewHolder
中检测到对
parent
的触摸,如下所示

private void OnLongClick(LinearLayout _ReactionLayout)
        {
            try
            {  
                _ReactionLayout.Visibility = ViewStates.Visible;

            }
            catch (Exception X)
            {
                Log.Info("1022585", "CLICK (ERROR) : " + X.Message);
            }
        }
parent.Click += (sender, e) => { OnParentClick(REACTION_LAYOUT); }; 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/main_message_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/colorPrimary"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    android:orientation="vertical"> 
  <include layout="@layout/toolbar_messages"/>   
  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="4.5dp"
      android:layout_marginTop="3dp"
      android:background="@drawable/shadow"/>  
  <RelativeLayout     
    android:layout_width="match_parent"
    android:layout_height="fill_parent">   
  <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/rvMessages"
     android:layout_width="match_parent"
      android:layout_height="wrap_content"         
      android:background="?attr/colorPrimary"      
      android:layout_alignParentTop="true"
    android:paddingBottom="70dp"/>  .......
这是可行的,但它禁用了“回收器”视图上的滚动

实现这一目标的最佳方式是什么

编辑:活动回收视图如下

private void OnLongClick(LinearLayout _ReactionLayout)
        {
            try
            {  
                _ReactionLayout.Visibility = ViewStates.Visible;

            }
            catch (Exception X)
            {
                Log.Info("1022585", "CLICK (ERROR) : " + X.Message);
            }
        }
parent.Click += (sender, e) => { OnParentClick(REACTION_LAYOUT); }; 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/main_message_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/colorPrimary"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    android:orientation="vertical"> 
  <include layout="@layout/toolbar_messages"/>   
  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="4.5dp"
      android:layout_marginTop="3dp"
      android:background="@drawable/shadow"/>  
  <RelativeLayout     
    android:layout_width="match_parent"
    android:layout_height="fill_parent">   
  <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/rvMessages"
     android:layout_width="match_parent"
      android:layout_height="wrap_content"         
      android:background="?attr/colorPrimary"      
      android:layout_alignParentTop="true"
    android:paddingBottom="70dp"/>  .......

每当您单击recylerview项时,都会调用此方法

itemView.setOnClickListener(v -> {
               // Add your functionalities here

            });

每当您单击recylerview项时,都会调用此方法

itemView.setOnClickListener(v -> {
               // Add your functionalities here

            });

检查这是否有助于禁用滚动:

recyclerView.setNestedScrollingEnabled(false);

检查这是否有助于禁用滚动:

recyclerView.setNestedScrollingEnabled(false);

上面是非常有线的代码顺便说一句,从我得到的,如果你的解决方案工作良好,但嵌套滚动在这种情况下不

public class _OnRecylerTouch_Listener : Java.Lang.Object, View.IOnTouchListener
        {
            private LinearLayout _L;
            public _OnRecylerTouch_Listener(LinearLayout L)
            {
                _L = L;
            }
            public bool OnTouch(View v, MotionEvent e)
            {
                 if (_L.Visibility == ViewStates.VISIBLE) {
                    _L.Visibility = ViewStates.Gone;
                     return true;
                 }
                 return false;
            }
        }
然后下一步将您的
onLongClickListener
更改为下一个

private void OnLongClick(LinearLayout _ReactionLayout)
    {
        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
           @Override
            public void run() 
            {
               try {  
                    _ReactionLayout.Visibility = ViewStates.Visible;
                 }

                catch (Exception X)
                {
                    Log.Info("1022585", "CLICK (ERROR) : " + X.Message);
                }

            }, 100);

        }
    }
你们的问题应该得到解决

解释


你所需要的就是不要截获触摸事件。应该由内部滚动使用。而
onLongClickListener
的操作应该在
onTouch
之后触发可见性更改以正常工作。这不是最好的解决方案,但这是您的问题,因此您可以找出原因

以上是非常有线的代码。顺便说一句,从我得到的信息来看,如果您的解决方案运行良好,但嵌套滚动在这种情况下不起作用

public class _OnRecylerTouch_Listener : Java.Lang.Object, View.IOnTouchListener
        {
            private LinearLayout _L;
            public _OnRecylerTouch_Listener(LinearLayout L)
            {
                _L = L;
            }
            public bool OnTouch(View v, MotionEvent e)
            {
                 if (_L.Visibility == ViewStates.VISIBLE) {
                    _L.Visibility = ViewStates.Gone;
                     return true;
                 }
                 return false;
            }
        }
然后下一步将您的
onLongClickListener
更改为下一个

private void OnLongClick(LinearLayout _ReactionLayout)
    {
        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
           @Override
            public void run() 
            {
               try {  
                    _ReactionLayout.Visibility = ViewStates.Visible;
                 }

                catch (Exception X)
                {
                    Log.Info("1022585", "CLICK (ERROR) : " + X.Message);
                }

            }, 100);

        }
    }
你们的问题应该得到解决

解释



你所需要的就是不要截获触摸事件。应该由内部滚动使用。而
onLongClickListener
的操作应该在
onTouch
之后触发可见性更改以正常工作。这不是最好的解决方案,但这是您的问题,因此您可以找出原因

你将代码添加到Recylerview itemView.onClick方法recyclerview的父布局是什么?@Ali检查下面的答案。你将代码添加到Recylerview itemView.onClick方法recyclerview的父布局是什么?@Ali检查下面的答案。这也不走运。这也不走运,我也试过了,我还尝试了
if(e.Action==MotionEventActions.Up)
THEN true或false,但仍然没有luck@Ali运动事件在此不应执行任何操作。完全插入上面的内容。完全插入上面的内容,滚动现在可以工作,但是
\L
没有隐藏在
视图状态上。消失了
@Ali似乎我发现了问题。请检查以上方法。插头完全一样,这对你有用。谢谢,伙计,是的,我需要为这个问题找到更好的解决方案,谢谢你的帮助,标记正确的答案。是的,我也尝试过,我也尝试过使用
if(e.Action==MotionEventActions.Up)
然后为真,否则为假,但仍然为否luck@Ali运动事件在此不应执行任何操作。完全插入上面的内容。完全插入上面的内容,滚动现在可以工作,但是
\L
没有隐藏在
视图状态上。消失了
@Ali似乎我发现了问题。请检查以上方法。插头完全一样,这对你有用。谢谢,伙计,是的,我需要为这个问题找到一个更好的解决方案,谢谢你的帮助,标记出正确的答案。