NestedScrollView 滚动时不听

NestedScrollView not listening while scrolling

我正在使用 Xamarin.Android 构建一个应用程序,当我滚动时,侦听器不工作,它只是被忽略,因为没有任何反应。为什么我需要 NestedScrollView?因为我想在滚动条上隐藏或显示浮动按钮:

我试过版本:

  1. 这个在我不包含任何内容的另一个视图中完美运行 列表视图:

    view.FindViewById<NestedScrollView>(Resource.Id.nsvMain).ScrollChange += Nsv_ScrollChange;
    private void Nsv_ScrollChange(object sender, NestedScrollView.ScrollChangeEventArgs e)
    {
        if (e.ScrollY > e.OldScrollX)
        {
            FabIdea.Hide();
        }
        else
        {
            FabIdea.Show();
        }
    }
    
  2. 这是我的第二个想法,因为前一个没用:

    view.FindViewById<NestedScrollView>(Resource.Id.nsvMain).SetOnScrollChangeListener(new NestedScrollViewListener());
    
    public class NestedScrollViewListener : Java.Lang.Object, IOnScrollChangeListener
    {
        public IntPtr Handle { get; set; }
    
        public void Dispose()
        {
    
        }
    
        public void OnScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
        {
            throw new NotImplementedException();
        }
    }
    

这是我的 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nsvMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <EditText
                  android:id="@+id/txtSearch"
                  android:hint="@string/txtSearch"
                  android:layout_height="wrap_content"
                  android:layout_width="match_parent"
                  android:paddingLeft="10dp"
                  android:paddingRight="10dp" />
            <ListView
                android:nestedScrollingEnabled="true"
                android:divider="@null"
                android:dividerHeight="0dp"
                android:layout_margin="8dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/lstRuins" />
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fabFilter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@drawable/filter" />
</android.support.design.widget.CoordinatorLayout>

我唯一的猜测是连接到 ListView,但我的应用程序严格适用于 API 21+,我已经将其启用为 android:nestedScrollingEnabled="true"。另外,我正在使用片段中的这个。

出于测试目的,我从 ViewTreeObserver 触发了滚动事件,我注意到 ScrollY 始终为 0:

这是我的最终实现,我需要对逻辑进行重大更改:

XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.design.widget.TextInputLayout
            android:layout_margin="4dp"
            android:id="@+id/txtSearch_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
          <EditText
            android:drawableStart="@drawable/magnify"
            android:drawableLeft="@drawable/magnify"
            android:id="@+id/txtSearch"
            android:hint="@string/txtSearch"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:paddingLeft="10dp"
            android:drawablePadding="5dp"
            android:paddingRight="10dp" />
        </android.support.design.widget.TextInputLayout>
        <ListView
            android:divider="@null"
            android:dividerHeight="0dp"
            android:layout_margin="8dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/lstRuins" />
    </LinearLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fabFilter"
        android:layout_width="wrap_content"
        android:tint="@android:color/white"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@drawable/filter" />
</FrameLayout>

我需要实现一个新的 class 来实现:IOnScrollListener

C#:

public class AbsListViewListener : Java.Lang.Object, IOnScrollListener
{
    public MayanListFragment MayanListFragment { get; set; }
    private static int lastItem = 0;

    public AbsListViewListener(MayanListFragment mayanListFragment)
    {
        MayanListFragment = mayanListFragment;
    }

    public void OnScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    {
        if (MayanListFragment.FabFilter == null)
            return;

        if (lastItem > (firstVisibleItem + visibleItemCount) || firstVisibleItem == 0)
        {
            MayanListFragment.FabFilter.Show();
        }
        else
        {
            MayanListFragment.FabFilter.Hide();
        }
        lastItem = firstVisibleItem + visibleItemCount;
    }

    public void OnScrollStateChanged(AbsListView view, [GeneratedEnum] ScrollState scrollState)
    {

    }
}


LstRuins.SetOnScrollListener(new AbsListViewListener(this));

然后它通常有效。