我在listview上使用平滑滚动体验了奇怪的行为。 我有30个项目在列表中。当我顺利滚动
listview.smoothScrollToPositionFromTop(29, 0);
屏幕末尾会有一些额外的空间。实际上listview转移了一点。附图如下。但如果我手动滚动,将没有空间。如何解决此问题?
这是我的布局:
<?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>
答案 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 :(得分: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);
}
});
}
这是经过充分测试的。并为我工作。这是输出。
答案 6 :(得分:0)
尝试使用xml:
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="0dp"
android:clipToPadding="false"/>