6

Gingerbread では、smoothScrollToPosition() を使用して一度に多数の項目をスクロールしても問題はありませんでした。Nexus S を Ice Cream Sandwich にアップグレードした後、smoothScrollToPosition() に何を入力しても、どちらの方向にも数百ピクセルしかスクロールせず、停止することに気付きました。

これは ICS の既知の問題ですか? Galaxy Nexusでもこれに気づきました。私は他のいくつかの質問を見て、notifyDataSetChanged() への呼び出しをオフにしたり、smoothScrollToPosition() を遅延ランナブルとして投稿したりするなど、いくつかの異なるトリックを試しましたが、残念ながら、1 回以上スクロールしたくありません。停止する前に数百ピクセル程度。:(

4

5 に答える 5

12

アニメーションを終了するために必要な期間に問題があるようです。同じ問題が SmoothScrollBy(int distance, int duration) にも存在します。ざっと見ただけで、smoothScrollToPosition() は、多くの処理を行う SmoothScrollBy() の親しみやすいラッパーです。レッグワーク。SmoothScrollBy() は、ユーザーがモーションを作成したかのように、「フリング ジェスチャ」を偽造しています。

SmoothScrollBy は実際には、期間がなくなるまで再投稿し続ける fling ランナブルを投稿するだけです。つまり、以前に移動することを決定したオフセットに基づいて必要なスクロール オフセットを計算するだけなので、ターゲット オフセットに到達する前に期間が切れると、最後に計算されたオフセットで停止します。(ターゲット オフセットに突然ジャンプするのではなく、アニメーション化されないため、おそらくより耳障りです)。

ListView セル (子) は高さが完全に動的であるため、Android の担当者にとって困難なのは、必要なオフセットに到達するために各 run() 呼び出しでどれだけ移動するかを決定することです。目に見える子供の身長は彼らにはわかりません。これは、Android のスクロールバーがスクロールするとサイズが変動するのと同じ理由で、現在表示されているものに基づいてどのくらいの大きさになるべきかを推測する必要があります。

とにかく、それはあなたがそれを解決するのに役立ちませんが、誰かがそれを面白いと思うかもしれません:)

ただし、セルの高さが静的であることがわかっている場合は、独自のメソッドを記述して、smoothScrollBy() に渡す距離と期間を自分で計算し、X 距離を移動する静的な時間を確保できます。そうでない場合は、1000 ミリ秒の高い SCROLL_DURATION のために実際に機能しているソリューション bigstones を使用するだけで十分です。根本的な原因ではない 2.2 バージョンを使用するのではなく、ICS バージョンを使用してこの属性を変更することもできます。

これらのランナブルを独自のカスタム アルゴリズムに適合させることもできます。微調整はそれほど難しくありません。

于 2012-09-14T05:24:43.873 に答える
2

これは、問題を解決するために私がしたことです。基本的に、目的の要素に到達するまでスムーズスクロールを呼び出し続けたいと考えています (この場合、要素 0 である一番上までスクロールしたいだけです)。

//There is a known bug where smoothScrollToPosition(..) may not reach the top, 
            //if the list is very large, keep scrolling until you reach the top element
            newsFeed.setOnScrollListener(new OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {

                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {
                    if(firstVisibleItem != 0) {
                        newsFeed.smoothScrollToPosition(0);
                    } 
                    else {
                        //We are done
                        newsFeed.setOnScrollListener(null);
                    }
                }
            });
            newsFeed.smoothScrollToPosition(0);
于 2013-07-04T14:53:25.273 に答える
0

ICSにも問題があります。

メッセージを送信した後、毎回リストビューをスムーズに下にスクロールする必要があります。したがって、notifyDataSetChanged() を呼び出した後、smoothScrollToPosition() メソッドを呼び出しました。他の Android ビルド バージョンでは、問題なく動作します。しかし、ICS では非常に奇妙です。リストビューが一番下にある場合、3 つのケースをテストしました。リストビューに新しい項目を 1 つ追加すると、スクロールしません。リストビューに2つの新しいアイテムを追加すると->うまくスクロールします。そして、リストビューを数ピクセル上にスクロールすると、新しいアイテムを1つ追加した後、うまくスクロールします。多くのグーグル検索とテストの後、私はこれについて無力感を感じています. 最後に、データをリストビューに設定するたびに、最後の位置に空のビュー (1px) を追加しますが、これは良い方法ではありませんが、私にとってはうまくいきます。

于 2013-09-24T11:24:47.910 に答える
0

ListView は getChildCount() メソッドを使用して AbsListView.java ソース コードの位置カウントを取得するためです。しかし、ListView では getChildCount() メソッドは正しくカウントを取得できません。setSelection() メソッドを使用する必要があるかもしれません。

于 2012-09-27T07:36:19.327 に答える