0

スクロール/フリングのたびにListViewを再調整しようとしています。再調整とは、ListViewの一番上の項目がListViewの一番上に揃えられるように再調整することを意味します。切り取られた場合は、再調整されて完全に表示されるまでスムーズに下にスクロールする必要があります。

スクロールリスナーを実装しました:

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メソッドが「通常の」スクロールを実行するときと同じ方法で実行されることを教えてくれますが。

これはなぜですか。また、フリング後でもListViewを再調整するにはどうすればよいですか。

4

2 に答える 2

1

以下は機能するはずですが、Galaxyタブ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());  
                    }
                }); 
            }
        }
    });
于 2012-12-26T16:45:14.923 に答える
0

古いデバイスでは、の後にListViewレポートされません。ここに記載されている回避策を使用してください。http://code.google.com/p/android/issues/detail?id=5086#c7SCROLL_STATE_IDLESCROLL_STATE_TOUCH_SCROLL

correctingこのコードでは役に立たないため、変数を安全に削除することもできます。

于 2012-12-26T14:46:37.520 に答える