Остановить анимацию прокрутки ListView - PullRequest
3 голосов
/ 16 июня 2011

У меня есть ListView с около 100 записей.Когда пользователь «перебрасывает» снизу вверх, он начинает прокручивать и продолжает прокручивать, даже когда палец больше не касается дисплея.

Есть ли способ остановить анимацию прокрутки на этом этапе?

Ответы [ 5 ]

16 голосов
/ 04 января 2012

и мы ищем исходный код Android (AbsListView), даем ему ACTION_CANCEL touchEvent, можем остановить бросок. это легко.

listView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0));
9 голосов
/ 02 сентября 2011

Я не пробовал решение Pompe de velo, но поскольку smoothScrollToPosition() недоступно для уровня API ниже 8, у меня это не сработало.

Я согласен, изменение поведения по умолчанию не Хорошая идея, но иногда вам нужно.Итак, вот мое (грязное) решение, которое использует отражение.Это далеко не рекомендуемый способ, так как это взлом, но он работает для меня.Возможно, есть лучшее решение, но я не нашел его.

class StopListFling {

    private static Field mFlingEndField = null;
    private static Method mFlingEndMethod = null;

    static {
        try {
            mFlingEndField = AbsListView.class.getDeclaredField("mFlingRunnable");
            mFlingEndField.setAccessible(true);
            mFlingEndMethod = mFlingEndField.getType().getDeclaredMethod("endFling");
            mFlingEndMethod.setAccessible(true);
        } catch (Exception e) {
            mFlingEndMethod = null;
        }
    }

    public static void stop(ListView list) {
        if (mFlingEndMethod != null) {
            try {
                mFlingEndMethod.invoke(mFlingEndField.get(list));
            } catch (Exception e) {
            }
        }
    }
}
3 голосов
/ 09 февраля 2012

Вы можете предотвратить бросание для ListViews в API 8, переопределив onTouchEvent и вызвав smoothScrollBy.

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_UP:
        this.smoothScrollBy(0, 0);
        break;
    }
    return super.onTouchEvent(ev);
}

Это заменяет прокрутку с прокруткой и вместо этого прокручивает 0px.

3 голосов
/ 16 июня 2011

Ну, конечно, есть способ сделать это.Но вопрос в том, лучше ли это делать, на мой взгляд.

Список - это стандартный элемент управления Android, который постоянно работает во всех приложениях.Поэтому я был бы удивлен, если бы нашел список, который не ведет себя так же в вашем приложении.Вы можете в любой момент остановить бросок, вернув палец обратно на экран.

Тем не менее, если вы хотите выполнить дополнительную работу, вы можете создать подкласс представления списка и переопределить его метод касания.Лучший способ узнать, что делать, - это получить исходный код ListView ( ListView в Android 1.6 ).

0 голосов
/ 16 июня 2011

Мое мнение таково, что вы не должны изменять это поведение, так как пользователь ожидает именно этого.

Впрочем, на ваш вопрос. Я не пробовал это, но теоретически это должно работать.

Реализуйте OnScrollListener для вашего ListView и используйте метод onScrollStateChanged(), чтобы проверить, является ли текущее состояние SCROLL_STATE_FLING. После того, как вы определили, что прокрутка выполняется одним нажатием, вы можете получить первую видимую позицию ListView, используя метод getFirstVisiblePosition(), а оттуда вы можете использовать smoothScrollToPosition() где вы указали в качестве аргумента значение getFirstVisiblePosition().

...