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

时间:2017-03-02 10:35:23

标签: android listview scroll

我在listview上使用平滑滚动体验了奇怪的行为。 我有30个项目在列表中。当我顺利滚动

listview.smoothScrollToPositionFromTop(29, 0);

屏幕末尾会有一些额外的空间。实际上listview转移了一点。附图如下。但如果我手动滚动,将没有空间。如何解决此问题?

Image 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>

7 个答案:

答案 0 :(得分:4)

正如您所说,我认为这是一个Android问题。它似乎是过度滚动的动画的一部分,它似乎被卡住了#39;在完成动画之前。我与SwipeToRefresh有类似的经历,其中进度指示器在刷新后不会完全消失。

无论如何,你可以通过关闭动画来解决方法

    listView.setOverScrollMode(View.OVER_SCROLL_NEVER);

不幸的是,即使手动滚动,这也会丢失动画。如果你可以忍受,我认为这将解决你的问题。

AbsListView#setOverScrollMode(int)

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

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

    Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.invisible_footer, null);
    listView.setOverscrollFooter(drawable);

在drawable文件夹中,&#34; invisible_footer.xml&#34;

<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>

ListView.html#setOverscrollHeader()

这给出了选择:

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

答案 1 :(得分:1)

我已经实施了。但是,在最初的第一次将垫子保持在底部,但从第二次开始工作正常。

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.socialintegration.ListAct">
<ListView
    android:id="@+id/listTemp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>

</RelativeLayout>

代码:

public class ListAct extends AppCompatActivity {
ListView l;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    String str[] = new String[50];
    for (int i = 0; i < 50; i++) {
        str[i] = "poistion" + i;
    }
    ArrayAdapter adpt = new ArrayAdapter(ListAct.this, android.R.layout.simple_dropdown_item_1line, str);
    l = (ListView) findViewById(R.id.listTemp);
    l.setAdapter(adpt);

    l.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            l.smoothScrollToPositionFromTop(29, 0);
        }
    });
}
}

答案 2 :(得分:1)

您是否尝试将ListView的高度设置为wrap_content而不是match_parent

即使在[本教程]中,所有属性都设置为wrap_content。因此,请将宽度和高度上的ListView属性替换为:

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

答案 3 :(得分:0)

<ListView>
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layout_behavior="@string/appbar_scrolling_view_behavior/>

好的,试试看: 应用程式:layout_behavior = “@串/ appbar_scrolling_view_behavior”

答案 4 :(得分:0)

还有其他SO帖子link描述了类似的问题。我想那篇文章的解决方案可以解决你的问题。

答案 5 :(得分:0)

我坚信要转移到RecyclerView。 如果你不想搬家。 这是解决方法。只需将此方法添加到您的活动中,然后将其调用即可。

private void smoothScrollToTop(final int pos) {
    listView.smoothScrollToPositionFromTop(pos, 0);
    listView.post(new Runnable() {
        @Override
        public void run() {
            listView.smoothScrollToPosition(pos);
        }
    });
}

这是经过充分测试的。并为我工作。这是输出。

enter image description here

答案 6 :(得分:0)

尝试使用xml:

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="0dp"
android:clipToPadding="false"/>