【问题标题】:How to show the last item in the List View when scrolled to get new items dynamically?滚动以动态获取新项目时如何在列表视图中显示最后一个项目?
【发布时间】:2012-05-16 16:08:13
【问题描述】:

我的应用程序中有一个列表视图,最初显示 10 个项目,当我滚动到底部时,它每次都会动态添加 10 个项目。我的问题是当我滚动到底部时,显示到列表中的第一项(不是新添加的 10 项),所以我需要一直向下滚动。

我用过

ListView.setSelection(totalItemCount - 9);

显示新添加的 10 项中的第一项。但这里发生的情况是显示实际上转到列表视图的第一项,但它再次自动滚动到新添加的 10 项的第一项。所以,这里的用户体验会很糟糕......我希望它改变,这样它就不会进入列表视图的顶部。希望我解释清楚,请帮助,谢谢

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    当您向下滚动并开始获取新数据时,您应该使用此方法将您的最后可见位置存储在一些变量中:

    int firstVisiblePosition = listView.getFirstVisiblePosition();
    

    编辑 试试这个:

    View view = listView.getChildAt(0);
    int distFromTop = (view == null) ? 0 : view.getTop();
    

    然后在您完成加载数据后,您应该使用:

    listView.setSelectionFromTop(firstVisiblePosition, distFromTop);
    

    【讨论】:

    • 是的,这就是我现在正在实施的方式.....这里发生的事情是它第一次到达顶部,然后到达 setSelection(firstVisiblePosition)
    【解决方案2】:

    我不认为手动设置选择是一种良好的用户体验(因为他们可能正在查看列表中的顶部项目)。

    一旦您动态检索到要添加到列表中的新项目集,您可以简单地调用 addAll() 方法,然后使用 notifyDatasetChanged() 通知适配器需要刷新内容。 Listviews 很聪明地记住刷新时的当前位置。

    【讨论】:

    • 是的,我正在使用 addAll() 和 noifyDataSetChanged()
    【解决方案3】:

    您可能想要覆盖列表视图的 onSizeChanged(...) 方法。

    我猜那是它导航到顶部。

    试试这样的:

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    setSelection(getCount()-9);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多