Я тоже думал о реализации такой функции, но пока не сделал этого. Поэтому единственное, что я могу предоставить, - это некоторые идеи о том, как I может решить эту проблему. Если в конце концов я написал какой-нибудь код, я выложу его здесь.
- Основной необходимый класс - это пользовательский адаптер, который расширяет
ListAdapter
(ArrayAdapter, SimpleCursorAdapter и т. Д.).
- Адаптер применяет View.OnTouchListener ко всем своим представлениям.
- Всякий раз, когда этот слушатель обнаруживает горизонтальную прокрутку
dx
, он вызывает concernedView.offsetLeftAndRight(dx)
(что делает представление перетаскиваемым). Конечно, адаптер должен сохранить текущее горизонтальное смещение для вида. Если пользователь перетаскивает вид и удаляет его / ее палец с экрана, touchListener также обнаружит это и запустит анимацию сдвига назад. Используя текущее смещение, мы также можем вычислить альфа-значение, поэтому при приближении к границам экрана изображение будет затухать.
- Если одна запись списка в конечном итоге отклоняется пользователем, она становится немного хитрой, и я все еще не уверен, как бы я реализовал следующее действие: содержимое списка необходимо обновить (или адаптер должен игнорировать отклоненные записи) и представления, которые были ниже той, которая была отклонена, должны парить вверх, чтобы заполнить пробел. Я думаю, что это может сработать, чтобы ListView загрузил новый контент, но это мгновенно восполнит пробел. Чтобы избежать этого, я бы затем запустил анимацию, которая позволяет всем заинтересованным видам парить из своей старой позиции (где у нас все еще был разрыв) обратно в их текущую позицию (где разрыв заполнен).
Это лишь некоторые из моих мыслей по этому вопросу, которые могут помочь некоторым людям начать работать над этой проблемой. Как я уже сказал, я, вероятно, собираюсь реализовать это когда-нибудь в будущем и, конечно, я опубликую код здесь.
Буду признателен за любые отзывы в комментариях, но я не хочу подробно объяснять каждый аспект моей идеи, это заняло бы у меня слишком много времени;)