Skip to content

Instantly share code, notes, and snippets.

@reuniware
Last active March 15, 2019 09:49
Show Gist options
  • Save reuniware/3b738da6cf8a52766493f188386cfabf to your computer and use it in GitHub Desktop.
Save reuniware/3b738da6cf8a52766493f188386cfabf to your computer and use it in GitHub Desktop.
RecyclerView swipe to left and show edit and delete buttons.
package com.util
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.AssetManager
import android.graphics.*
import android.support.v4.content.res.ResourcesCompat
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.helper.ItemTouchHelper.Callback
import android.support.v7.widget.helper.ItemTouchHelper.*
import android.view.MotionEvent
import android.support.v7.widget.helper.ItemTouchHelper.ACTION_STATE_SWIPE
import android.view.View
import com.activity.R
import timber.log.Timber
/*
Classe de gestion du Swipe sur la RecyclerView sur ComptaActivityXYZ
*/
lateinit var assetManager : AssetManager
lateinit var context: Context
class SwipeController : Callback() {
fun setAssetManager(assetMgr: AssetManager) {
assetManager = assetMgr
}
fun setContext(contextp: Context) {
context = contextp
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
//Log.d("SwipeController", "onSelectedChanged")
super.onSelectedChanged(viewHolder, actionState)
}
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
//return makeMovementFlags(0, LEFT or RIGHT)
return makeMovementFlags(0, LEFT)
}
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
// La ligne a été swipée
}
override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
if (actionState == ACTION_STATE_SWIPE) {
setTouchListener(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}
drawButtons(c, viewHolder)
val translationX: Float
val itemViewWidth: Float = viewHolder.itemView.width.toFloat()
if (dX > 0) {
translationX = Math.min(-dX, /*itemViewWidth / 2*/ buttonWidth * 2)
} else {
translationX = Math.max(dX, -1 * /*itemViewWidth / 2*/ buttonWidth * 2)
}
super.onChildDraw(c, recyclerView, viewHolder, translationX, dY, actionState, isCurrentlyActive)
}
@SuppressLint("ClickableViewAccessibility")
private fun setTouchListener(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
recyclerView.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View, event: MotionEvent): Boolean {
//swipeBack = event.action == MotionEvent.ACTION_CANCEL || event.action == MotionEvent.ACTION_UP
//Timber.d("onTouch")
//Timber.d(event.toString())
if (event.action == MotionEvent.ACTION_DOWN) {
Timber.d("ACTION_DOWN")
val x = event.x
val y = event.y
if (x >= deleteButton.left && x <= deleteButton.right && y >= deleteButton.top && y <= deleteButton.bottom) {
Timber.d("Delete button clicked")
} else if (x >= editButton.left && x <= editButton.right && y >= editButton.top && y <= editButton.bottom) {
Timber.d("Edit button clicked")
}
}
return false
}
})
}
val buttonWidth = 150f
var buttonWidthWithoutPadding: Float = 10.0F
lateinit var deleteButton: RectF
lateinit var editButton: RectF
private fun drawButtons(c: Canvas, viewHolder: RecyclerView.ViewHolder) {
buttonWidthWithoutPadding = buttonWidth - 20
val corners = 16f
val itemView = viewHolder.itemView
val p = Paint()
deleteButton = RectF(itemView.right - buttonWidthWithoutPadding, itemView.top.toFloat(), itemView.right.toFloat(), itemView.bottom.toFloat())
p.setColor(Color.LTGRAY)
p.style = Paint.Style.FILL_AND_STROKE
c.drawRoundRect(deleteButton, corners, corners, p)
drawTextDeleteButton(c, deleteButton, p)
editButton = RectF(itemView.right - buttonWidthWithoutPadding, itemView.top.toFloat(), itemView.right - buttonWidthWithoutPadding * 2, itemView.bottom.toFloat())
p.setColor(Color.LTGRAY)
p.style = Paint.Style.FILL_AND_STROKE
c.drawRoundRect(editButton, corners, corners, p)
drawTextEditButton(c, editButton, p)
}
private fun drawTextEditButton(c: Canvas, button: RectF, p: Paint) {
val font = ResourcesCompat.getFont(context, R.font.line_awesome)
val spSize = 30
val pxSize = spSize * context.resources.displayMetrics.scaledDensity
val textSize = pxSize
p.color = Color.BLACK
p.isAntiAlias = true
p.textSize = textSize
p.typeface = font
val textWidth = p.measureText("\uF2B1")
c.drawText("\uF2B1", button.centerX() - textWidth / 2, button.centerY() + textSize / 2, p)
}
private fun drawTextDeleteButton(c: Canvas, button: RectF, p: Paint) {
val font = ResourcesCompat.getFont(context, R.font.linea_basic_10)
val spSize = 30
val pxSize = spSize * context.resources.displayMetrics.scaledDensity
val textSize = pxSize
p.color = Color.BLACK
p.isAntiAlias = true
p.textSize = textSize
p.typeface = font
val textWidth = p.measureText("\uF2B1")
c.drawText("", button.centerX() - textWidth / 2, button.centerY() + textSize / 2, p)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment