Как запустить анимацию при клике на кнопку во ViewPager и изменить значения полей
Я делаю приложение для запоминания английских слов. У меня есть БД с карточками, ViewModel, и фрагмент с адаптером для ViewPager2. Фрагмент наблюдает за списком карточек и передаёт его в адаптер. Также в адаптер я передаю обработчики для нажатия на кнопки. Как при нажатии на кнопку я могу запустить анимацию(поворот карточки) и изменить значения(engWord, rusWord) полей, или что можно для этого использовать? Я пытаюсь это сделать при помощи BindingAdapters, но пока не понимаю как это реализовать. Подскажите, как лучше сделать, может кто сталкивался с подобным? Это моя карточка в бд
@Entity(tableName = "word_table")
data class Card (
@PrimaryKey(autoGenerate = true)
val id: Long = 0L,
@ColumnInfo(name = "english_word")
val engWord: String,
@ColumnInfo(name = "russian_word")
val rusWord: String,
// @ColumnInfo(name = "id_audio_file")
// val playSound: Int,
@DrawableRes
@ColumnInfo(name = "id_image_file")
val img: Int,
@ColumnInfo(name = "date_learned_word")
val date: String?,
@ColumnInfo(name = "is_idiom")
val isIdiom: Boolean,
@ColumnInfo(name = "category")
val category: String?,
@ColumnInfo(name = "mark")
var mark: Boolean = false
)
Здесь я передаю обработчики в адаптер
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewPager = binding.viewPager
positionDataStore = SettingsDataStore(requireContext().dataStore)
val adapter = SliderAdapter(
FlipButtonListener { card -> Toast.makeText(context, "${card.id} is flipped", Toast.LENGTH_SHORT).show() },
StarButtonListener { card -> sliderViewModel.updateCard(card.copy().apply { mark = !mark }) }
)
viewPager.adapter = adapter
Это мой адаптер
class SliderAdapter(
private val flipClickListener: FlipButtonListener,
private val starClickListener: StarButtonListener )
: ListAdapter<Card, RecyclerView.ViewHolder>(SliderDiffCallBack) {
companion object SliderDiffCallBack : DiffUtil.ItemCallback<Card>() {
override fun areItemsTheSame(oldItem: Card, newItem: Card): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Card, newItem: Card): Boolean {
Timber.i("cardId: ${oldItem.id} oldItemMark: ${oldItem.mark} newItemMark: ${newItem.mark}")
return oldItem == newItem
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
: RecyclerView.ViewHolder {
return CardViewHolder.create(parent)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val card = getItem(position)
(holder as CardViewHolder).bind(card, starClickListener, flipClickListener)
}
class CardViewHolder private constructor(private val binding: SliderCardItemBinding)
: RecyclerView.ViewHolder(binding.root) {
fun bind(item: Card, starClickListener: StarButtonListener, flipClickListener: FlipButtonListener) {
item.apply {
binding.card = item
binding.flipClickListener = flipClickListener
binding.starClickListener = starClickListener
Timber.i("BIND[${item.id}]: ${item.mark}")
binding.executePendingBindings()
}
}
companion object {
fun create(parent: ViewGroup): CardViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = SliderCardItemBinding.inflate(layoutInflater, parent, false)
return CardViewHolder(binding)
}
// Только что добавленные карточки
private val justAddedCard: MutableList<Card> = mutableListOf()
}
}
}
class StarButtonListener(val starClickListener: (card: Card) -> Unit) {
fun onStarClick(card: Card) = starClickListener(card)
}
class FlipButtonListener(val flipCardListener: (card: Card) -> Unit) {
fun onFlipButtonClick(card: Card) = flipCardListener(card)
}
а это макет
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="card" type="com.example.emi.database.Card"/>
<variable name="starClickListener" type="com.example.emi.ui.slider.StarButtonListener"/>
<variable name="flipClickListener" type="com.example.emi.ui.slider.FlipButtonListener"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:id="@+id/flippedCard"
android:layout_width="0dp" android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
app:cardCornerRadius="24dp"
android:layout_marginEnd="8dp"
style='style="?attr/materialCardViewOutlinedStyle"'
android:layout_marginTop="8dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/eng_word"
android:text="eng_word"
app:cardText="@{card}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
app:layout_constraintTop_toBottomOf="@+id/cardView"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
android:fontFamily="@font/oswald"
android:textColor="@color/primaryColor"/>
<androidx.cardview.widget.CardView
android:layout_width="0dp" android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHeight_percent="0.7"
app:cardCornerRadius="24dp"
android:id="@+id/cardView"
>
<ImageView
android:id="@+id/image_word"
app:cardImage="@{card}"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srcCompat="@drawable/lemon"
android:adjustViewBounds="false"
android:scaleType="centerCrop"/>
</androidx.cardview.widget.CardView>
<ImageButton
android:id="@+id/btn_star"
android:layout_width="50dp"
app:cardMark="@{card}"
app:srcCompat="@drawable/star"
android:onClick="@{() -> starClickListener.onStarClick(card)}"
android:layout_height="50dp"
android:background="#00FFFFFF"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toStartOf="@+id/flip_card"
app:layout_constraintHorizontal_chainStyle="spread_inside" android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="8dp"/>
<ImageButton
android:id="@+id/flip_card"
android:onClick="@{() -> flipClickListener.onFlipButtonClick(card)}"
android:layout_width="50dp"
android:layout_height="50dp"
app:srcCompat="@drawable/rotate_1"
android:background="#02FFFFFF"
app:layout_constraintStart_toEndOf="@+id/btn_star"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/btn_star"
app:layout_constraintBottom_toBottomOf="@+id/btn_star" android:layout_marginEnd="8dp"/>
<TextView
android:id="@+id/card_id"
android:text="TextView"
app:cardId="@{card}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/eng_word"
android:layout_marginTop="16dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
при нажатии на flip_card <ImageButton android:id="@+id/flip_card" я хочу повернуть <androidx.cardview.widget.CardView android:id="@+id/flippedCard" и изменить значение в поле <TextView android:id="@+id/eng_word" android:text="eng_word"