0

だから私は興味深い問題を抱えています。私は正確な行選択を維持し、向きの変更でyoffsetしたいListViewを持っています。そのため、私は次のように呼びます:

list.postDelayed(new Runnable() {
        @Override
        public void run() {
            list.requestFocusFromTouch();
            list.setSelectionFromTop(finalPosition, yoffset);
        }
    },100);

かなり簡単に見え、うまく機能します。問題は、向きを 2 回変更すると (元の向きに戻る、つまり、横向き ->縦向き ->横向き)、リストが TouchMode を終了したとき、つまり list.isInTouchMode() が false を返すことです (最初の向きの変更では、list.isInTouchMode() .isInTouchMode() は true を返し、すべてがうまくいき、クリックが機能するなど)。そのため、 setSelectionFromTop() を使用してプログラムでリストビューをスクロールし、最初にアプリの他の場所に触れずにリスト内の項目をクリックすると、リストがジャンプしてクリックした場所にスクロールし、間違った項目が強調表示されます。それは非常に迷惑であり、私はそれを修正する方法を見つけることができないようです. どんなアイデアや提案も大歓迎です。

list.requestFocusFromTouch() を呼び出しても、TouchMode の設定には影響がないようです。

詳細: Android:ListView が開いたときにアイテムを選択済みとして設定するには?

Romain Guy の投稿を見つけました。 android-developers/browse_thread/thread/590b02939d14675b/077ad77e4217e56e?lnk=gst&q=[android]+scroll+listview+not+in+touchmode#077ad77e4217e56e

私がやりたいのは、2回目の向きの変更でユーザーが実際にデバイスに触れることを強制せずに、どういうわけかTouchModeに入ることです。list.dispatchTouchEvent() を複数回試しました。間違ったモーション イベントを送信している可能性があります。

list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), 
    SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 
    list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), 
    SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE , 
    list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), 
    SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 
    list.getWidth(), list.getHeight(), 0));

もう 1 つのオプションは、TouchMode でなくなった理由を突き止めることです。onConfigurationChanged() をオーバーライドしていないため、向きが変わるたびにレイアウトが完全に再構築されます。

前もって感謝します!

ジャレド

4

1 に答える 1

0

Listview の setItemChecked(...) メソッドを使用してみてください。Listview が CHOICE_MODE_SINGLE に設定されている場合、かなりの量が使用されているのを見てきました。そのモードでは、実際に各リストビュー項目がチェック可能なオブジェクトになるからです。

また、誰かが同様のことをしようとしていた次の QA も見てください。最も簡単な解決策は、「チェックされた」アイテムに別の背景を作成することだったようです。

Android リストビュー配列アダプターが選択されました

于 2012-05-07T20:04:37.673 に答える