【问题标题】:How to detect if ListView items are enough to trigger scrolling如何检测 ListView 项目是否足以触发滚动
【发布时间】:2014-05-30 08:19:44
【问题描述】:

我有一个聊天应用程序,如果 ListView 项目不足以滚动,那么该行应该位于列表顶部。如果项目足以触发滚动,则列表应始终向下滚动以显示最新的对话,就像在 iMessage 设置中一样。

我尝试在 XML 中添加:

android:stackFromBottom="true"

但这会导致ListView 向下滚动ALWAYS. 我只想在项目足以导致滚动时向下滚动,否则它应该向上滚动。

如果我能检测到滚动的启用,我会使用它:

myListView.post(new Runnable() {
    @Override
    public void run() {
        // Select the last row so it will scroll into view...
        myListView.setSelection(myListAdapter.getCount() - 1);
    }
});

那么我如何检测ListView 项是否足以触发滚动?

【问题讨论】:

    标签: android android-listview scroll chat listviewitem


    【解决方案1】:

    你可以试试这个来检测可滚动的

    if (yourListView.getLastVisiblePosition() == yourListView.getAdapter().getCount() -1)
    {
     //It is scrolled all the way down here
    }
    

    检查最后一个可见项目是否仍然小于项目编号:)

    【讨论】:

    • 由于我在 Asynctask 下填充 ListView,因此我在设置 ListView 适配器后放置了您的代码块。但它似乎不起作用,因为它是一个聊天应用程序,我有一个 ListView 项目,其中有很多文本,所以高度很大,触发了滚动。我认为您的代码块只有在 item count 可以触发滚动时才有效,但我现在才意识到,即使是单行也可以有很大的高度,因为它是聊天。
    • 您的列表视图是一个全局变量,其中一项是包含您的文本消息的文本视图。您首先在 onPreExcute() 中填充列表视图以加载所有先前的消息(如果有)。我认为,触发器应该在这里应用。
    • 我一直在我的 onPostExecute 中填充我的ListViews。这里真正的问题是项目编号被计算在内,但项目本身的高度很大,所以滚动已经触发但仍然不符合您的条件。
    • yourListView.getChildAt(yourListView.getChildCount() - 1).getBottom()
    【解决方案2】:

    我通过将此代码 listView.setSelection(rowAdapter.getCount()); 放在 listView.setAdapter(rowAdapter); 之后来解决此问题。当聊天消息很少时,它会向上滚动,当消息足以触发滚动时,它会滚动到底部。就像我想要的一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多