#android #listview #onlongclicklistener #ontouch
#Android #просмотр списка #onlongclicklistener #ontouch
Вопрос:
Я пытаюсь объединить ListViewRemovalAnimation (http://developer.android.com/shareables/devbytes/ListViewRemovalAnimation.zip ) с перетаскиванием ячеек и их перестановкой (http://developer.android.com/shareables/devbytes/ListViewDraggingAnimation.zip )
Я пытаюсь вернуть false, когда пользователь удерживает просмотр в течение x секунд в onTouch и, таким образом, вызывает LongClick.
Однако переход к удалению, похоже, работает отлично, но я, похоже, не могу найти способ вызвать OnLongClickListener, когда это необходимо. Я попытался определить разницу во времени между тем, когда пользователь впервые нажимает на просмотр, и текущим временем, но, похоже, это не сработало. Я также думал об использовании обработчика с запускаемым, но я не мог придумать способ выполнить то, что я хотел.
У меня такое чувство, что я подхожу к этому с неправильной точки зрения, но любая помощь по удалению с помощью перетаскивания и перестановки listview была бы оценена 🙂
Вот код для onTouch:
public boolean onTouch(final View v, MotionEvent event) {
time = event.getDownTime();
if (mSwipeSlop < 0) {
mSwipeSlop = ViewConfiguration.get(ListViewDraggingAnimation.this).
getScaledTouchSlop();
}
if(SystemClock.uptimeMillis() - time > 2000) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mAnimating) {
// Multi-item swipes not handled
return false;
}
mItemPressed = true;
mDownX = event.getX();
break;
case MotionEvent.ACTION_CANCEL:
setSwipePosition(v, 0);
mItemPressed = false;
break;
case MotionEvent.ACTION_MOVE:
{
ifNameTaken.setText("debug69");
if (mAnimating) {
return false;
}
float x = event.getX();
if (isRuntimePostGingerbread()) {
x = v.getTranslationX();
}
float deltaX = x - mDownX;
float deltaXAbs = Math.abs(deltaX);
if (!mSwiping) {
if (deltaXAbs > mSwipeSlop) {
mSwiping = true;
listView.requestDisallowInterceptTouchEvent(true);
}
}
if (mSwiping) {
setSwipePosition(v, deltaX);
}
}
break;
case MotionEvent.ACTION_UP:
{
if (mAnimating) {
return false;
}
// User let go - figure out whether to animate the view out, or back into place
if (mSwiping) {
float x = event.getX();
if (isRuntimePostGingerbread()) {
x = v.getTranslationX();
}
float deltaX = x - mDownX;
float deltaXAbs = Math.abs(deltaX);
float fractionCovered;
float endX;
final boolean remove;
if (deltaXAbs > v.getWidth() / 4) {
// Greater than a quarter of the width - animate it out
fractionCovered = deltaXAbs / v.getWidth();
endX = deltaX < 0 ? -v.getWidth() : v.getWidth();
remove = true;
} else {
// Not far enough - animate it back
fractionCovered = 1 - (deltaXAbs / v.getWidth());
endX = 0;
remove = false;
}
// Animate position and alpha
long duration = (int) ((1 - fractionCovered) * SWIPE_DURATION);
animateSwipe(v, endX, duration, remove);
} else {
mItemPressed = false;
}
}
break;
default:
return false;
}
return true;
}
Я также не редактировал какой-либо код ListViewDraggingAnimation onLongClick.
РЕДАКТИРОВАТЬ: я попытался поместить сравнение между SystemClock.uptimeMillis() — event.getDownTime() > 2000 вне переключателя, думая, что Action_Down выполняется только тогда, когда пользователь нажимает только вниз, но это все равно не вернуло false . Я думаю, что проблема может заключаться в самом логическом сравнении
Ответ №1:
Используйте Log.d() для проверки значений переменных с помощью logcat, похоже, у вас проблемы с тестированием.
onLongClick был бы функцией вне этой функции onTouch