滚动时最后的Android listview额外空间

Alo*_*Leo 8 android listview scroll

我在listview上经历了平滑滚动的奇怪行为.我有30个项目在列表中.当我顺利滚动通过

listview.smoothScrollToPositionFromTop(29, 0);
Run Code Online (Sandbox Code Playgroud)

屏幕末尾会有一些额外的空间.实际上listview转移了一点.附图如下.但如果我手动滚动,将没有空间.可以采取哪些措施来解决此问题?

图片1

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_light">

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

Gar*_*y99 4

正如你所说,我认为这是一个 Android 问题。它似乎是过度滚动动画的一部分,它似乎在完成动画之前被“卡住”。我也有过类似的经历SwipeToRefresh,刷新后进度指示器没有完全消失。

不管怎样,你可以通过关闭动画来解决

    listView.setOverScrollMode(View.OVER_SCROLL_NEVER);
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使手动滚动,也会丢失动画。如果你能忍受这一点,我想这会解决你的问题。

AbsListView#setOverScrollMode(int)

编辑:(原始答案被接受后)

我还找到了另一种解决方法。这个保留了滚动动画。不幸的是,它还有另一个缺点。如果用户在执行其他操作之前自动滚动,则存在底部边框的相同问题。如果用户手动滚动到底部第一个,从那时起就没有问题了。如果用户自动滚动并获取边框,然后手动滚动,就不再有问题了。所以,这是替代方法。

    Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.invisible_footer, null);
    listView.setOverscrollFooter(drawable);
Run Code Online (Sandbox Code Playgroud)

在可绘制文件夹中,“invisible_footer.xml”

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="2dp"
    android:width="10dp"

    android:viewportWidth="10"
    android:viewportHeight="2">

    <!-- a horizontal line -->
    <path android:pathData="M 1 1 H 10"
        android:strokeColor="#00000000" android:strokeWidth="1" />

</vector>
Run Code Online (Sandbox Code Playgroud)

ListView.html#setOverscrollHeader()

这给出了选择:

  1. 失去滚动动画
  2. 保留动画,但存在用户看到底部边框 1 次的风险