Archived
Implemented drag-and-drop reordering ability in quote recycler view; refactored project structure
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user