-
-
Save reuniware/3b738da6cf8a52766493f188386cfabf to your computer and use it in GitHub Desktop.
RecyclerView swipe to left and show edit and delete buttons.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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