9

Я хотел бы реализовать жестов для удаления строк в ListView, аналогичных уведомлениям о android.Проведите по удалению listitem

Сейчас у меня есть ListView с onTouchListener - при этом у меня уже есть обнаружение проводов.

gestureDetector = new GestureDetector(this, new GestureListener()); 
onTouchListener = new TouchListener(); 
listview.setOnTouchListener(onTouchListener); 

Мой GestureListener класс:

protected class GestureListener extends SimpleOnGestureListener 
{ 
    private static final int SWIPE_MIN_DISTANCE = 150; 
    private static final int SWIPE_MAX_OFF_PATH = 100; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 100; 

    private MotionEvent mLastOnDownEvent = null; 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     mLastOnDownEvent = e; 
     return super.onDown(e); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
    { 
     if(e1 == null){ 
      e1 = mLastOnDownEvent; 
     } 
     if(e1==null || e2==null){ 
      return false; 
     } 

     float dX = e2.getX() - e1.getX(); 
     float dY = e1.getY() - e2.getY(); 

     if (Math.abs(dY) < SWIPE_MAX_OFF_PATH && Math.abs(velocityX) >= SWIPE_THRESHOLD_VELOCITY && Math.abs(dX) >= SWIPE_MIN_DISTANCE) { 
      if (dX > 0) { 
       Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show(); 
      } 
      return true; 
     } 
     else if (Math.abs(dX) < SWIPE_MAX_OFF_PATH && Math.abs(velocityY)>=SWIPE_THRESHOLD_VELOCITY && Math.abs(dY)>=SWIPE_MIN_DISTANCE) { 
      if (dY>0) { 
       Toast.makeText(getApplicationContext(), "Up Swipe", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getApplicationContext(), "Down Swipe", Toast.LENGTH_SHORT).show(); 
      } 
      return true; 
     } 
     return false; 
    } 
} 

Мой TouchListener класс:

protected class TouchListener implements View.OnTouchListener 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent e) 
    { 
     if (gestureDetector.onTouchEvent(e)){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

Есть некоторые учебники/примеры по этому поводу?

благодаря

ответ

4

Если у вас есть работа обнаружения салфетки, все, что осталось, чтобы удалить элемент. Для этого следующий код удалит элемент с экрана.

yourListViewAdapter.yourListItems.remove(position); 
yourListViewAdapter.notifyDataSetChanged(); 
+0

Мне нужно реализовать обнаружение салфетки в каждом списке? или я могу оставить его в списке и получить элемент для удаления другими способами? и как я могу заставить элемент на самом деле бросить представление? – marcin

+0

@marcin no, вы можете просто установить его для списка. Нажмите [здесь] (http://stackoverflow.com/questions/4373485/android-swipe-on-list), чтобы увидеть, как реализовать это точно – wdziemia

1

Я думаю, мне действительно нужно реализовать прикосновенный слушатель на каждой строке в списке. -> искать пользовательские ArrayAdapter

, как для метания предметов, я нашел отличный учебник, который отвечает на большинство моих вопросов: http://mobile.tutsplus.com/tutorials/android/android-gesture/

+0

. Я должен был изучить этот вопрос лучше. речь идет о рисовании на холсте. так что это действительно не о моей проблеме. – marcin

3

Вы можете достигнуть хороший эффект, добавив в ваше обнаружение салфетки:

  //if swipe to left detected 
      Display display = getWindowManager().getDefaultDisplay(); 
      v.clearAnimation(); 
      TranslateAnimation translateAnim = new TranslateAnimation(0, -display.getWidth(), 0, 0); 
      translateAnim.setDuration(250); 
      translateAnim.setAnimationListener(new Animation.AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) { 
       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 
       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        yourListViewAdapter.yourListItems.remove(position); 
        yourListViewAdapter.notifyDataSetChanged(); 
       } 
      }); 
      v.startAnimation(translateAnim); 
0

В моем поиске какого-то прослушивателя, я наткнулся на код прокрутки Романа Нурика. [1]: https://github.com/romannurik/android-swipetodismiss

Я использовал это в своем приложении, и это работает как шарм!

Это написано так же, как и реализованный слушатель, поэтому мне было легко работать.

Смежные вопросы