NestedScrollView 滚动时不听
NestedScrollView not listening while scrolling
我正在使用 Xamarin.Android 构建一个应用程序,当我滚动时,侦听器不工作,它只是被忽略,因为没有任何反应。为什么我需要 NestedScrollView
?因为我想在滚动条上隐藏或显示浮动按钮:
我试过版本:
这个在我不包含任何内容的另一个视图中完美运行
列表视图:
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();
}
}
这是我的第二个想法,因为前一个没用:
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));
然后它通常有效。
我正在使用 Xamarin.Android 构建一个应用程序,当我滚动时,侦听器不工作,它只是被忽略,因为没有任何反应。为什么我需要 NestedScrollView
?因为我想在滚动条上隐藏或显示浮动按钮:
我试过版本:
这个在我不包含任何内容的另一个视图中完美运行 列表视图:
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(); } }
这是我的第二个想法,因为前一个没用:
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));
然后它通常有效。