滚动/弹出后重新排列Listview

时间:2012-12-26 14:01:25

标签: android listview scroll

我想在每次滚动/投掷后让ListView重新排列。通过重新调整,我的意思是重新排列,使ListView的顶部项目与ListView的顶部对齐,如果它被切断,它应该平滑地向下滚动,直到它重新对齐并完全可见。

我实现了一个scroll-listener:

firstRowListView.setOnScrollListener(new OnScrollListener() {
        private boolean correcting = false;

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        }

        @Override
        public void onScrollStateChanged(AbsListView arg0, int scrollState) {
                if (!correcting && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                    correcting = true;
                    firstRowListView.smoothScrollToPosition(firstRowListView.getFirstVisiblePosition());
                    correcting = false;
                }
            }
        }
    });

(为了更容易查看,我只留下重要的位)。如果我顺利滚动(没有投掷)它工作正常,但如果我扔掉列表它不会重新调整自己。虽然LogCat告诉我onScrollStateChange-method的执行方式与执行“普通”滚动时的执行方式相同。

为什么这样,以及如何在Fling之后让ListView重新调整?

2 个答案:

答案 0 :(得分:1)

以下应该可以工作但是在Galaxy tab 7(4.0.4)上我可以看到递归发生。因此,我强烈建议您实施一些机制来避免这种情况,否则此解决方案将在某些设备上中断:

mylv.setOnScrollListener(new OnScrollListener() { 
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
        }

        @Override
        public void onScrollStateChanged(final AbsListView lv,
                int scrollState) { 
            if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
                lv.post(new Runnable() {

                    @Override
                    public void run() {
                        lv.smoothScrollToPosition(lv
                                .getFirstVisiblePosition());  
                    }
                }); 
            }
        }
    });

答案 1 :(得分:0)

在较早的设备ListViewSCROLL_STATE_IDLE之后不会报告SCROLL_STATE_TOUCH_SCROLL。请使用此处提到的解决方法。 http://code.google.com/p/android/issues/detail?id=5086#c7

您也可以安全地删除correcting变量,因为在此代码中没有用。