Implemented drag-and-drop reordering ability in quote recycler view; refactored project structure

This commit is contained in:
denizk0461
2023-05-15 14:16:48 +02:00
parent 252c69a3ef
commit e0e7a4cbe0
15 changed files with 121 additions and 115 deletions
@@ -0,0 +1,83 @@
package com.denizd.textbasic.adapter
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.denizd.textbasic.R
import java.util.Collections
class QuoteAdapter(
quotes: List<String>,
) : RecyclerView.Adapter<QuoteAdapter.QuoteViewHolder>(),
RecyclerRowMoveCallback.RecyclerViewTouchHelperContract {
private var mutableQuotes: MutableList<String> = quotes.toMutableList()
class QuoteViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val quote: TextView = view.findViewById(R.id.quote)
val delete: ImageButton = view.findViewById(R.id.delete_button)
}
// override fun getItemViewType(position: Int): Int {
// return /*if (position == itemCount - 1) 1 else*/ 0
// }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuoteViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.quote_entry, parent, false)
return QuoteViewHolder(v)
}
override fun onBindViewHolder(holder: QuoteViewHolder, position: Int) {
val currentItem = mutableQuotes[position]
holder.quote.text = currentItem
holder.quote.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun afterTextChanged(p0: Editable?) {}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
mutableQuotes[holder.layoutPosition] = p0.toString()
}
})
holder.delete.setOnClickListener {
mutableQuotes.removeAt(holder.layoutPosition)
notifyItemRemoved(holder.layoutPosition)
}
}
override fun getItemCount(): Int = mutableQuotes.size
fun addNewQuote() {
mutableQuotes.add("")
notifyItemInserted(mutableQuotes.size + 1)
}
fun getAllQuotes(): Array<String> {
return mutableQuotes.filter { s -> s.isNotBlank() }.toTypedArray()
}
override fun onRowMoved(from: Int, to: Int) {
if (from < to) for (i in from until to) {
Collections.swap(mutableQuotes, i, i + 1)
} else for (i in to downTo from - 1) {
Collections.swap(mutableQuotes, i, i - 1)
}
notifyItemMoved(from, to)
}
override fun onRowSelected(viewHolder: QuoteViewHolder) {
// TODO
}
override fun onRowClear(viewHolder: QuoteViewHolder) {
// TODO
}
}
@@ -0,0 +1,55 @@
package com.denizd.textbasic.adapter
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
class RecyclerRowMoveCallback(
private val touchHelperContract: RecyclerViewTouchHelperContract,
) : ItemTouchHelper.Callback() {
override fun isLongPressDragEnabled(): Boolean {
return true
}
override fun isItemViewSwipeEnabled(): Boolean {
return false
}
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
): Int = makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0)
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
touchHelperContract.onRowMoved(viewHolder.adapterPosition, target.adapterPosition)
return false
}
override fun onSelectedChanged(
viewHolder: RecyclerView.ViewHolder?,
actionState: Int,
) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
touchHelperContract.onRowSelected(viewHolder as QuoteAdapter.QuoteViewHolder)
}
super.onSelectedChanged(viewHolder, actionState)
}
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)
touchHelperContract.onRowClear(viewHolder as QuoteAdapter.QuoteViewHolder)
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
interface RecyclerViewTouchHelperContract {
fun onRowMoved(from: Int, to: Int)
fun onRowSelected(viewHolder: QuoteAdapter.QuoteViewHolder)
fun onRowClear(viewHolder: QuoteAdapter.QuoteViewHolder)
}
}