ItemDecoration переопределяет getItemOffsets () и анимацию

Я применяю равные поля к моему RecyclerView с помощью GridLayoutManager , переопределяя метод getItemOffsets() (см. Мой код ниже).

Однако, когда объект удаляется из адаптера, анимация удаления вызывается без смещений. Таким образом, аномалия начинается в другом положении, чем объект, подлежащий удалению.

Я попытался получить позицию через getSpanIndex(position) но позиция ( parent.getChildAdapterPosition(view) ) возвращает NO_POSITION поскольку объект уже удален из адаптера, когда getItemOffsets() .

Есть ли способ получить смещения в моем случае?

 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { GridLayoutManager mgr = parent.getLayoutManager(); int position = parent.getChildAdapterPosition(view); if (position == RecyclerView.NO_POSITION) { // here I need to access the position of the current element // and call outRect.set(left, top , right, bottom); // which is not possible because it is no longer in the adapter return; } int spanCount = mgr.getSpanCount(); int spanSize = mgr.getSpanSizeLookup().getSpanSize(position); int spanIndex = mgr.getSpanSizeLookup().getSpanIndex(position, spanCount); if (spanIndex == spanCount-1) { // last element left = space / 2; right = space; } else if (spanIndex == 0) { // first element left = space; right = space / 2; } else { // middle element left = space / 2; right = space / 2; } outRect.set(left, top, right, bottom); } 

Попробуйте использовать представления LayoutParams . Если вы не используете какой-либо пользовательский LayoutManager , он должен содержать необходимую информацию.

 int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewAdapterPosition(); 

На самом деле, это нехорошее решение получить детскую позицию от родителя. Фактическое состояние зрения может отличаться от реального состояния, потому что одновременно работает или ItemDecorator, или LayoutManager, или RecyclerView, чтобы управлять ими, или Адаптер для изменения положения некоторых элементов.

Лучше, когда попросите Recycler предоставить вам ViewHolder для определенного вида. Затем вы можете получить всю информацию, что вам нужно (getLayoutPosition (), getAdapterPosition ()).

 parent.getChildViewHolder(view).getLayoutPosition(); parent.getChildViewHolder(view).getAdapterPosition; 

И еще один совет, а не по вашему делу. Если вам нужно получить ItemCount, не используйте adapter.getItemCount (), лучше получить из состояния, потому что количество элементов может отличаться в Adapter и Recycler.

 state.getItemCount() 
Intereting Posts
Отправить текстовый тег для Instagram с помощью моего приложения для Android Как запустить активность из виджета lockscreen без разблокировки? Как я могу определить, какой размер (в пикселях) должен отображаться для Android, чтобы отображать это изображение правильно на устройствах? Замените и увеличьте число в имени файла в приложении для Android. Как скрыть OpenGLRenderer в отладке (андроид-студия) Направление компаса отличается в зависимости от ориентации телефона Как остановить службу из другой активности в Android? Соединение WiFi через android MediaPlayer – сбой setDataSource – Не удалось открыть fd для контента: // Ресурс Android HTML со ссылками на другие ресурсы Ошибка при разрешении getLayoutInflater Ошибка при запуске Android Studio: не удалось создать JVM: код ошибки-6 Направление прокрутки в OnPageChangeListener Schedulers.immediate () не работает с ошибками градиента командной строки Android: с помощью registerContentObserver (), чтобы быть уведомленным по мере изменения контактов