Как сделать прокрутку RecyclerView плавно?

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

Чтобы быть конкретным, я использую RecyclerView с GridLayoutManager. Все, что я хочу – это макет сетки, который можно прокручивать плавно (например, приложение по умолчанию), ничего необычного, но стандартная реализация диспетчера компоновки сетки прокручивает представление «отрывистым» способом. Я попытался реализовать метод по ссылке выше, но безуспешно.

Я также попытался реализовать LinearSmoothScroller, но я не уверен, как реализовать метод computeScrollVectorForPosition. Документация Google на computeScrollVectorForPosition буквально содержит 0 слов.

Я нашел это учебное пособие из 3 частей , но это было очень мало. Итак, все, что я хочу задать, это: может ли быть какой-то код шаблона, который мы можем реализовать в LinearSmoothScroller или путем расширения RecyclerView.SmoothScroller и добиться плавной прокрутки? Даже если код зависит от количества элементов и элементов в строке в gridlayout, должен быть некоторый способ сделать это легко. Я что-то упустил?

Типичным источником «отвратительной» прокрутки в Android является приложение, занимающее слишком много времени на основном потоке приложения, обновляющем интерфейс. В случае RecyclerView это означало бы слишком много времени в onBindViewHolder() или, возможно, в onCreateViewHolder() . Каждый из них должен вернуться в субмиллисекунды раз, что означает, что вы не можете выполнять операции ввода / вывода с диска или сетевой ввод-вывод.

Думаю, я нашел проблему. Я использую файл holder.photo.setImageBitmap (BitmapFactory.decodeFile (itemList.get (position) .get AbsolutePath ())); На onBindViewHolder (), а файл изображения – около 100 кб каждый с примерно дюжиной изображений в списке

Да, это будет делать дисковый ввод-вывод и декодирование изображения в главном потоке приложения. Это будет достаточно медленным, чтобы вызвать jank в пользовательском интерфейсе (т. Е. «Отрывистую» прокрутку).

Подумайте об использовании библиотеки загрузки изображений, такой как Picasso или Universal Image Loader, так как они могут асинхронно заполнять ваш ImageView из растрового изображения.

В этом примере приложения используется Universal Image Loader, чтобы заполнить содержимое RecyclerView (с помощью GridLayoutManager ), причем источником данных являются доступные видео на устройстве.

Добавьте это везде, где вы объявили recyclerview в своей деятельности или фрагменте

 RecyclerView mRecyclerview = (RecyclerView) findViewById(...); mRecyclerview.setNestedScrollingEnabled(false); 

SetNestedScrollview (false) выполняет вашу работу.

 android:animateLayoutChanges="false" 

Просто добавьте это

 animateLayoutChanges = true 

В recyclerview xml

Intereting Posts
Ndk-build не смогла построить сверхмощную аудио-библиотеку после недавнего обновления NDK Эспрессо, как проверить, завершено ли действие? Самый быстрый / простой способ найти методы в Java / Android, которые выполняют второй или более Заполнить EditText любого приложения из службы (Доступность)? Выберите каталог / файл с помощью Intent.ACTION_CREATE_DOCUMENT (Storage Access Framework) Android – ручка «Enter» в EditText Аналоговый аналог ASM или CGLIB для Dalvik Предотвратить показ веб-страницы «веб-страница недоступна» Андроид: сделать полноэкранный просмотр изображений AutoCompletetextView с CursorLoader Неизвестный URL-адрес: // загрузки / my_downloads Как пользовательское приложение whatsapp обнаруживает изменение в изображении профиля своего контакта? ListView скрыть некоторые элементы Как сохранить экземпляр фрагмента фрагмента, воспроизводящего видео после изменения ориентации? Удаление файлов старше заданного времени из каталога