[英]How can I listen to click events in RecyclerView's ItemTouchHelper?
Anyone can teach me how I can add action event when user tap "Edit" icon on ChildDraw in ItemTouchHelper? 当用户在ItemTouchHelper中点击ChildDraw上的“编辑”图标时,有人可以教我如何添加动作事件吗?
Currently, when user swipe item, it's display background color and icon. 当前,当用户滑动项目时,它会显示背景颜色和图标。 I want to add action when user swipe RIGHT direction and tap "R.drawable.ic_vector_edit" image.
我想在用户向右滑动并点击“ R.drawable.ic_vector_edit”图片时添加操作。
Is there anyway i can add event on that?... 无论如何,我可以在上面添加事件吗?...
ItemTouchHelper helper = new ItemTouchHelper(
new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
final int fromPos = viewHolder.getAdapterPosition();
final int toPos = target.getAdapterPosition();
adapter.notifyItemMoved(fromPos, toPos);
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// RIGHT to LEFT :: delete item
if (direction == ItemTouchHelper.LEFT) {
final int fromPos = viewHolder.getAdapterPosition();
Item myItem = adapter.getItemAtPosition(fromPos);
// delete the item
mItemViewModel.deleteItem(myItem);
}
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
float mdX = dX;
Bitmap bitmap;
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
// Get RecyclerView item from the ViewHolder
View itemView = viewHolder.itemView;
Paint p = new Paint();
float width = itemView.getHeight() / 5;
// LEFT to RIGHT :: edit item
if (dX > 0) {
mdX = dX / 5;
/* Set color for positive displacement */
int color = ContextCompat.getColor(getContext(), R.color.colorDarKGreen);
p.setColor(color);
// Draw Rect with varying right side, equal to displacement dX
c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), mdX,
(float) itemView.getBottom(), p);
bitmap = ResourceUtil.getBitmap(getContext(), R.drawable.ic_vector_edit);
float height = (itemView.getHeight() / 2) - (bitmap.getHeight() / 2);
c.drawBitmap(bitmap, (float) itemView.getLeft() + width, (float) itemView.getTop() + height, p);
} else { // RIGHT to LEFT :: delete item
/* Set color for negative displacement */
int color = ContextCompat.getColor(getContext(), R.color.colorDarkRed);
p.setColor(color);
// Draw Rect with varying left side, equal to the item's right side plus negative displacement dX
c.drawRect((float) itemView.getRight() + dX, (float) itemView.getTop(),
(float) itemView.getRight(), (float) itemView.getBottom(), p);
bitmap = ResourceUtil.getBitmap(getContext(), R.drawable.ic_vector_delete);
float height = (itemView.getHeight() / 2) - (bitmap.getHeight() / 2);
c.drawBitmap(bitmap, (float) itemView.getRight() - (bitmap.getWidth() + width), (float) itemView.getTop() + height, p);
}
super.onChildDraw(c, recyclerView, viewHolder, mdX, dY, actionState, isCurrentlyActive);
}
}
});
Try to use setOnTouchListener
on RecyclerView
for listening to touch events as following: 尝试在
RecyclerView
上使用setOnTouchListener
来监听触摸事件,如下所示:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
...
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
...
if (dX > 0) {
...
recyclerView.setOnTouchListener((v, event) -> {
int left = itemView.getLeft() + width;
int top = itemView.getTop() + height;
int right = left + bitmap.getWidth();
int bottom = top + bitmap.getHeight();
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE &&
event.getAction() == MotionEvent.ACTION_DOWN &&
event.getX() >= left && event.getX() <= right &&
event.getY() <= bottom && event.getY() >= top
) {
// Do what you want to do here...
onEditClicked(viewHolder.getAdapterPosition());
}
return false;
});
} else {
...
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.