Intereting Posts
Обработка событий щелчка на чертеже в EditText Android Spinner Gravity Не работает Доступ к AutoFocus / Flash с помощью Google Vision BarCode Reader Раздвижная панель должна скользить вверх одним нажатием кнопки. Использование open-source SlidingUpPanel из приложения Umano на GitHub Как я могу запустить это утверждение с помощью RxJava? Устройства Samsung Galaxy не могут использовать geolocation.getCurrentPosition Как включить события отбрасывания поверхности на logcat Панель инструментов внутри CardView для создания всплывающего меню (значок переполнения) API данных Youtube с OAuth2.0 на Android Android – поддерживает ли Lollipop Screen pinning несколько действий в одном приложении? Ограничьте безопасный режим Android при нажатии кнопки питания Загрузить локальный html в WebView? Как сделать Android Spinner с исходным текстом «Выбрать один», Я продолжаю получать сообщения: К сожалению, «некоторые китайцы» прекратили Привод Quickstart NullPointerException

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()