【问题标题】:smoothScrollToPosition in ExpandableListViewExpandableListView 中的 smoothScrollToPosition
【发布时间】:2012-01-26 02:22:12
【问题描述】:

我正在尝试使用 smoothScrollToPosition(int position) 方法滚动到 ExpandableListView 的底部,但失败了,因为我不知道如何计算 position 属性。

没有

adapter.getGroupCount()

也没有

adapter.getChildrenCount(getGroupCount()-1);

也没有

public int getLastIndex() {
    int count = 0;
    for (int g = 0; g < getGroupCount(); g++)
        count += getChildrenCount(g) + 1;
    return count;
}

成功了。

TLDR:如何在 API 级别 8+ 上(平滑)滚动到 ExpandableListView 的底部?

【问题讨论】:

  • 你在什么情况下尝试调用这个方法,我的意思是你想在什么情况下实现这个功能?

标签: android scroll expandablelistview android-animation


【解决方案1】:
expandableListView.setOnGroupClickListener(new OnGroupClickListener() {

    @Override
    public boolean onGroupClick(ExpandableListView parent, View v,
            int groupPosition, long id) {
        // TODO Auto-generated method stub
        parent.smoothScrollToPosition(groupPosition);
        return true;
    }
});

【讨论】:

  • 这应该滚动到点击的项目,而不是最后一个位置。没有?
【解决方案2】:
listView.post(new Runnable() {
    @Override
    public void run() {
        listView.smoothScrollToPositionFromTop(listView.getCount()*2, 0, 5000);
    }
});

ExpandableListView.post() 等待列表完成加载项目。 ExpandableListView.getCount() 获取项目(组和孩子)的计数

提供一个持续时间,以便列表不会快速滚动(方法需要 API 11) smoothScrollToPositionFromTop(int position, int offset, int duration)

【讨论】:

    【解决方案3】:

    你被计算的位置:

    public int getLastIndex() {
        int count = 0;
        for (int g = 0; g < getGroupCount(); g++)
            count += getChildrenCount(g) + 1;
        return count;
    }
    

    你可以用它来滚动

    expandableListView.smoothScrollToPosition(getLastIndex());
    

    但是,如果你在Activity类的onCreate()方法中调用smoothScrollToPosition()方法,你应该在UI显示在屏幕上之后使用Handler调用smoothScrollToPosition()方法:

      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .....
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                expandableListView.smoothScrollToPosition(getLastIndex());
            }
        },1000);
    }
    

    【讨论】:

    • 感谢提示,但在初始化阶段不会调用smoothScrollToPosition
    【解决方案4】:

    使用的位置取决于每个组是否展开。如果该组已展开,则将其所有子项添加到位置计数中。否则,不要!

    int getPosition(ExpandableListView listView, ExpandableListViewAdapter adapter) {
        int position = 0;
        for (int group = 0; group < adapter.getGroupCount(); ++group) {
            position += 1;
            if (listView.isGroupExpanded(group)) {
                position += adapter.getChildrenCount(group);
            }
        }
    }
    

    使用此位置应该会将您带到列表视图的底部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2014-11-18
      相关资源
      最近更新 更多