Android 如何防止视图被“删除”;按「;触控事件
我有一个Android 如何防止视图被“删除”;按「;触控事件,android,android-view,Android,Android View,我有一个RecyclerView,带有我自己的OnItemClickListener实现。为了突出显示单击的项目,我使用一个简单的选择器作为其背景: <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/item_inner_rect_pressed" android:state_pressed="true" /> &l
RecyclerView
,带有我自己的OnItemClickListener
实现。为了突出显示单击的项目,我使用一个简单的选择器作为其背景:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/item_inner_rect_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/item_inner_rect" />
</selector>
EDIT#2:我想我需要弄清楚视图
何时被“按下”(通过非“单击”)以获得起点。欢迎提出任何想法。在onTouch()
方法中,返回false
。这将告诉Android,OnTouchListener
不负责处理手势。我不能简单地返回false
,因为我的OnTouchListener
将停止工作。我添加了接受你的答案的代码,因为它通常是正确的。我只需要返回false
而不是从OnTouch()
返回,而是在调用onswip()
回调后从onFling()
方法返回,因为我不关心返回值为什么不向选择器xml添加更多状态,我想了想,但问题是:视图
对于点击和触摸事件都会进入“按下”状态。我需要它这样做,只有在点击事件。添加其他状态(如selected或focused)不会在简单单击时触发背景更改。
public class OnSwipeTouchListener implements View.OnTouchListener {
private final GestureDetector gestureDetector;
public OnSwipeTouchListener(Context context) {
gestureDetector = new GestureDetector(context, new GestureListener());
}
//not needed
public void onSwipeLeft() {
}
public void onSwipeRight() {
}
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_DISTANCE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
private static final int XY_VELOCITY_DIFFERENCE_THRESHOLD = 200;
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1 == null || e2 == null)
return false;
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY)
&& (Math.abs(velocityX) - Math.abs(velocityY) > XY_VELOCITY_DIFFERENCE_THRESHOLD)
&& Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD
&& Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight();
else
onSwipeLeft();
return true;
}
return false;
}
}
}