Проведите пальцем по экрану, чтобы удалить, не работает последовательно во всех фрагментах в ViewPagerAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Проведите пальцем по экрану, чтобы удалить, не работает последовательно во всех фрагментах в ViewPager

Сообщение Anonymous »

Я разрабатываю приложение для Android с двумя фрагментами макета таблицы, управляемыми ViewPager, в одном действии. У меня наблюдается несовместимое поведение с функцией удаления смахиванием элементов в RecyclerView в этих фрагментах.
У меня есть два фрагмента:
  • SpendingFragment
  • PurchaseGoalsFragment
Когда я прокручиваю пальцем, чтобы удалить элемент во фрагменте, который виден в данный момент , я ожидаю, что элемент вернется в исходное положение (состояние без пролистывания) сразу после пролистывания, поскольку я еще не удаляю элемент (просто наблюдаю за поведением пролистывания). Это работает так, как и ожидалось, для фрагмента, который в данный момент находится в поле зрения. Однако если я переключаюсь между этими фрагментами (например, изменяю их порядок в ViewPager), только тот фрагмент, который виден в данный момент, ведет себя правильно. В другом фрагменте элементы остаются в состоянии пролистывания и не возвращаются в исходное положение после пролистывания.
Ожидаемое поведение: >

После смахивания элемента в любом фрагменте элемент должен немедленно вернуться в исходное состояние (без удаления элемента). Это должно происходить независимо от того, какой фрагмент виден в данный момент.
Фактическое поведение:

Элемент во фрагменте, которого в данный момент нет в фокус остается перенесенным и не возвращается в исходное положение, даже если notifyItemChanged(position) вызывается в методе onSwiped. Такое поведение во всех фрагментах непоследовательно.
Изображение

Я использую собственный класс SwipeToDelete, который расширяет ItemTouchHelper.SimpleCallback. Вот упрощенная версия этого класса:

Код: Выделить всё

class SwipeToDelete(
private val swipableAdapter: SwipableAdapter,
private val icon: Drawable?, // Background Icon
private val backgroundColor: Int, // Background Color
private val cornerRadius: Float // Corner radius for the card
) : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {

private val paint = Paint().apply {
color = backgroundColor
isAntiAlias = true
}

override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}

override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val position = viewHolder.adapterPosition
swipableAdapter.onSwiped(position)
}
}
Вот мой интерфейс SwipableAdapter, реализованный моими адаптерами:

Код: Выделить всё

interface SwipableAdapter {
fun onSwiped(position: Int)
}
Вот класс адаптера моего первого показанного фрагмента:

Код: Выделить всё

class PurchaseGoalsAdapter(
private val goals: MutableList
,
private val moneyBox: MoneyBox
) : RecyclerView.Adapter(), SwipableAdapter {

// ... (other code)

override fun onSwiped(position: Int) {
notifyItemChanged(position)
println("PurchaseGoals adapter swiped: $position")
}

// Other methods...
}
Вот класс адаптера моего второго показанного фрагмента:

Код: Выделить всё

class SpendsAdapter(private val spendsList: List, private val moneyBox: MoneyBox) :
RecyclerView.Adapter(), SwipableAdapter {

// ... (other code)

override fun onSwiped(position: Int) {
println("Spends adapter swiped: $position")
notifyItemChanged(position)
}

// Other methods...
}
Вывод журнала

Код: Выделить всё

2024-10-05 15:25:52.635 11061-11061 System.out     I  PurchaseGoals adapter swiped: 0
2024-10-05 15:25:56.185 11061-11061 System.out     I  Spends adapter swiped: 0
Как я могу гарантировать, что элементы в обоих фрагментах вернутся в исходное положение после пролистывания, независимо от того, какой фрагмент виден?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -viewpager
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»