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
。要在mypublic 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似乎我发现了问题。请检查以上方法。插头完全一样,这对你有用。谢谢,伙计,是的,我需要为这个问题找到一个更好的解决方案,谢谢你的帮助,标记出正确的答案。