Scr*_*peW 5 android listener kotlin android-recyclerview
我已经RecyclerView设置了每个项目OnTouchListener并且OnClickListener
OnTouch监听器:
override fun onBindViewHolder(holder: ItemListViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item)
holder.itemView.cardview.setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
Log.d(TAG, "onBindViewHolder: $event.buttonState")
this.startDragListener.onStartDrag(holder)
}
return@setOnTouchListener true
}
}
Run Code Online (Sandbox Code Playgroud)
OnClickListener:(在视图持有者内部)
init {
itemView.setOnClickListener(this)
}
override fun onClick(v: View?) {
onItemClickListener.onItemClick(adapterPosition)
}
Run Code Online (Sandbox Code Playgroud)
问题是当我单击该项目时,仅startDragListener触发,但单击事件从未触发。
我在 stackoverflow 上读到了一些关于这个问题的类似问题,但其中大多数都是非常旧/已弃用的方法
如何解决这个问题并处理触摸监听器和点击监听器?
小智 4
请注意,onClickListener 不能与 onTouchListener 一起使用。您必须在 onTouchListener 中实现一些逻辑来区分单击和拖动。我做了类似的事情,代码是用java编写的,但你可以得到一个想法。
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
x = motionEvent.getX();
y = motionEvent.getY();
return true;
case MotionEvent.ACTION_UP:
// PUT ON CLICK LOGIC HERE
break;
case MotionEvent.ACTION_MOVE:
if ((motionEvent.getX() - x) > 80 || (x - motionEvent.getX()) > 80
|| (motionEvent.getY() - y) > 50 || (y - motionEvent.getY()) > 60) {
view.startDrag(data, new View.DragShadowBuilder(view) {
@Override
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
shadowSize.set(view.getWidth(), view.getHeight());
shadowTouchPoint.set((int) motionEvent.getX(), (int) motionEvent.getY());
}
}, view, 0);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |