Как провести лицевую карту в нижнем положении при перекрывающихся картах в Android?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как провести лицевую карту в нижнем положении при перекрывающихся картах в Android?

Сообщение Anonymous »

У меня есть набор перекрывающихся карточек, подобных этому. Перекрывающиеся карты
Итак, чего я хочу добиться, так это того, что когда я провожу ВЛЕВО по передней карте (A), она должна переместиться вниз всех перекрывающихся карточек и карты B ниже. это должно стать лицевой карточкой и так далее. Таким образом, в конечном итоге карта А снова появится, когда придет ее позиция. Ниже приведен мой фрагмент кода

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

class ToLearnFlashCards : Fragment() {

private lateinit var binding: FragmentToLearnFlashCardsBinding

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = FragmentToLearnFlashCardsBinding.inflate(layoutInflater, container, false)

val layoutManager = OverlappingLayoutManager(requireContext())
binding.recyclerview.layoutManager = layoutManager

val adapter = ToLearnAdapter { cardPair ->
cardViewmodel.deleteCards(cardPair)
}
binding.recyclerview.adapter = adapter
binding.recyclerview.itemAnimator = null

// Swipe Gesture
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
) {
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
val itemView = viewHolder.itemView
if (dX > 0) {
itemView.pivotX = itemView.width.toFloat()
itemView.pivotY = itemView.height.toFloat() / 2
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}

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
val cardPair = adapter.currentList[position]

when (direction) {
ItemTouchHelper.RIGHT -> {
//Some other logic here
}
ItemTouchHelper.LEFT -> {

adapter.moveItemToEnd(position)

}
}
}
})
itemTouchHelper.attachToRecyclerView(binding.recyclerview)

return binding.root
}
}
Ниже приведен код моего класса адаптера

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

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.visuallithuanian.R
import com.example.visuallithuanian.database.FlashcardPair

class ToLearnAdapter(
private val onDeleteListener: (FlashcardPair) -> Unit
) : ListAdapter.  (WordsComparator()) {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WordViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.recycle_view, parent, false)
return WordViewHolder(view)
}

override fun onBindViewHolder(holder: WordViewHolder, position: Int) {
val current = getItem(position)
holder.bind(current)
}

inner class WordViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val wordEnglish: TextView = itemView.findViewById(R.id.textView1English)
private val wordLithuanian: TextView = itemView.findViewById(R.id.textView2Lithuanian)

fun bind(item: FlashcardPair) {
wordEnglish.text = item.front
wordLithuanian.text = item.back
}
}

fun moveItemToEnd(position: Int) {
val currentList = currentList.toMutableList()
val item = currentList.removeAt(position)
currentList.add(item)
submitList(currentList)
}

class WordsComparator : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: FlashcardPair, newItem: FlashcardPair): Boolean {
return oldItem === newItem
}

override fun areContentsTheSame(oldItem: FlashcardPair, newItem: FlashcardPair): Boolean   {
return oldItem.front == newItem.front && oldItem.back == newItem.back
}
}
}
Ниже приведен мой собственный диспетчер перекрывающихся макетов.ktp>

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

import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.view.animation.Interpolator
import android.view.animation.LinearInterpolator
import androidx.annotation.Dimension
import androidx.core.view.ViewCompat
import androidx.recyclerview.widget.RecyclerView
import com.example.visuallithuanian.R

class OverlappingLayoutManager(context: Context) : RecyclerView.LayoutManager() {

private val horizontalOverlap: Float =
context.resources.getDimension(R.dimen.card_horizontal_overlap)
private val verticalOverlap: Float =
context.resources.getDimension(R.dimen.card_vertical_overlap)
@get:Dimension
private val tiltAngle: Float =
context.resources.getDimension(R.dimen.card_tilt_angle)
private var interpolator: Interpolator = LinearInterpolator()

override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {
return RecyclerView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
}

override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State?) {
if (itemCount == 0) {
removeAndRecycleAllViews(recycler)
return
}

detachAndScrapAttachedViews(recycler)

val parentWidth = width
val parentHeight = height

var zIndex = 0

for (position in 0 until itemCount) {
val view = recycler.getViewForPosition(position)
addView(view)

// Set z-index for the view
val elevation = zIndex.toFloat()
ViewCompat.setElevation(view, elevation)
zIndex++

measureChildWithMargins(view, 0, 0)
val width = getDecoratedMeasuredWidth(view)
val height = getDecoratedMeasuredHeight(view)

val centerX = parentWidth / 2f
val centerY = parentHeight / 2f

val itemOffset = calculateItemOffset(position)
val newCenterX = centerX + itemOffset * horizontalOverlap

val left = (newCenterX - (width / 2)).toInt()
val top = (centerY - (height / 2)).toInt()
val right = (newCenterX + (width / 2)).toInt()
val bottom = (centerY + (height / 2)).toInt()

layoutDecoratedWithMargins(view, left, top, right, bottom)

applyTilt(view, position)
}
}

private fun applyTilt(view: View, position: Int) {
val tilt = calculateTilt(position) * tiltAngle
view.pivotX = (view.width / 2).toFloat()
view.pivotY = (view.height / 2).toFloat()
view.rotation = tilt
}

protected open fun calculateItemOffset(position: Int): Float {
return if (position % 2 == 0) -1f else 1f
}

protected open fun calculateTilt(position: Int): Float {
return if (position % 2 == 0) -1f else 1f
}

fun setInterpolator(interpolator: Interpolator) {
this.interpolator = interpolator
}
}
Итак, я создал функцию под названием moveItemToEnd() с позицией параметра в классе «Мой адаптер». Поэтому я ожидал, что, когда я проведу ВЛЕВО по передней карте, она должна пойти в сторону нижнюю часть всех перекрывающихся карт, но она просто удаляется с передней позиции и не добавляется обратно в стопку карт.

Подробнее здесь: https://stackoverflow.com/questions/787 ... in-android
Ответить

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

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

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

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

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