9

オブジェクトが上から追加される動的 ListView を作成しました。

ユーザーがボタンを押すと、配列の内容から listView が更新され、カスタム arrayAdapter で notifyDataSetChanged() が呼び出されます。

追加時にリストの位置を維持したいので、次のコードを追加しました。

        // pausedCounter trace the number of objects(lines) to add to the listView
        int idx = listView.getFirstVisiblePosition() + pausedCounter;
        View first = listView.getChildAt(0);
        int position = 0;

        if (first != null)
            position = first.getTop();

        // cycle to add the new objects to the listView
        for (Tweet[] tweets1 : pausedTweets)
            super.updateTweets(tweets1);


        listView.setSelectionFromTop(idx, position);

        // reset of counter and accumulator
        pausedTweets = new ArrayList<Tweet[]>();
        pausedCounter = 0;

このコードは次のように動作します。getFirstVisiblePosition が 2 を返し、pausedCounter が 5 の場合、更新後にリストは新しい 5 つの要素の 3 番目に設定されます。

私が望むのは、リストの最初の可視要素を8番目に設定することです。

さらにテストした結果、このコードの実行中に listView の子の数が変化しないことがわかったので、setSelectionFromTopを呼び出した後にlistView のサイズを更新します。これが問題でしょうか?

4

1 に答える 1

22

トリックはこれでした:

        listView.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionFromTop(idx, finalPosition);
            }
        });

postメソッドを使用すると、位置を変更する前に ListView の更新を待つことができます。

于 2013-08-18T22:18:18.530 に答える