2010-10-13 6 views
13

привет, я должен добавить жест в свой список, я хочу реализовать ту же функциональность контактного приложения. , когда я оставил салфетки, он должен отправить сообщение, правый салфет должен позвонить. может кто-нибудь помочь мне, как сделать это обнаружение жестов ... я реализовал его в различных других представлениях ... но я не мог сделать для listView ... я не понимаю, что происходит worng ... мой код is`Жест в списке Android android

/** Called when the activity is first created. */ 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    // Create an array of Strings, that will be put to our ListActivity 
    String[] names = new String[] { "Linux", "Windows7", "Eclipse", "Suse", "Ubuntu", "Solaris", "Android", "iPhone"}; 
    // Create an ArrayAdapter, that will actually make the Strings above 
    // appear in the ListView 
    this.setListAdapter(new ArrayAdapter<String>(this, R.id.MyList, names)); 
    gestureListener = new ListView.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    };  
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    // Get the item that was clicked 
    Object o = this.getListAdapter().getItem(position); 
    String keyword = o.toString(); 
    Toast.makeText(this, "You selected: " + keyword, Toast.LENGTH_LONG).show(); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (gestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 

class MyGestureDetector extends SimpleOnGestureListener { 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
       return false; 
       // right to left swipe 
      } 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Context ctx = getApplicationContext(); 
       CharSequence txt = "Right to Left Swipe"; 
       int duration = Toast.LENGTH_LONG; 
       Toast toast = Toast.makeText(ctx, txt, duration); 
       toast.show(); 
       Toast.makeText(this.getItem(lv.pointToPosition((int)e1.getX(),(int) e1.getY()))); 
       // return super.onFling();           
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Context ctx = getApplicationContext(); 
       CharSequence txt = "Left to Right Swipe"; 
       int duration = Toast.LENGTH_LONG; 
       Toast toast = Toast.makeText(ctx, txt, duration); 
       toast.show(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
} 
+0

возможно дубликат [как реализовать махом в android listview] (http://stackoverflow.com/questions/4030389/how-to-implement-fling-in-android-listview) –

ответ

46

на основе ответов от поста [# 937313] [1] (благодарность Г и paiego), я взбитый следующий код для распознавания простых жестов (горизонтальные пойло) на ListView.

Однако после операции сбрасывания будет вызван слушатель ListView onItemClick()! Таким образом, вы получаете бросок и дополнительный onItemClick(). Я думаю, это связано с тем, что Android отправляет событие с щелчком мыши на каждую кнопку, независимо от того, как далеко продвинулся пользователь. Чтобы исправить это, вместо регистрации обычного OnItemClickListener() я предоставил свой собственный метод myOnItemClick(). Затем я переопределяю метод SimpleOnGestureListener.onSingleTapUp(), так что, когда палец вверх, этот метод вызовет myOnItemClick() вручную.

До сих пор этот метод отлично подходит для меня. Нет претензий :-).

public class PracticeActivity extends ListActivity { 

    private int REL_SWIPE_MIN_DISTANCE; 
    private int REL_SWIPE_MAX_OFF_PATH; 
    private int REL_SWIPE_THRESHOLD_VELOCITY; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // As paiego pointed out, it's better to use density-aware measurements. 
     DisplayMetrics dm = getResources().getDisplayMetrics(); 
     REL_SWIPE_MIN_DISTANCE = (int)(120.0f * dm.densityDpi/160.0f + 0.5); 
     REL_SWIPE_MAX_OFF_PATH = (int)(250.0f * dm.densityDpi/160.0f + 0.5); 
     REL_SWIPE_THRESHOLD_VELOCITY = (int)(200.0f * dm.densityDpi/160.0f + 0.5); 

     ListView lv = getListView(); 
     lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 
      m_Starbucks)); 

     final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector()); 
     View.OnTouchListener gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       return gestureDetector.onTouchEvent(event); 
      }}; 
     lv.setOnTouchListener(gestureListener); 

     // Long-click still works in the usual way. 
     lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       String str = MessageFormat.format("Item long clicked = {0,number}", position); 
       Toast.makeText(PracticeActivity.this, str, Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
     }); 
    } 

    // Do not use LitView.setOnItemClickListener(). Instead, I override 
    // SimpleOnGestureListener.onSingleTapUp() method, and it will call to this method when 
    // it detects a tap-up event. 
    private void myOnItemClick(int position) { 
     String str = MessageFormat.format("Item clicked = {0,number}", position); 
     Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); 
    } 

    private void onLTRFling() { 
     Toast.makeText(this, "Left-to-right fling", Toast.LENGTH_SHORT).show(); 
    } 

    private void onRTLFling() { 
     Toast.makeText(this, "Right-to-left fling", Toast.LENGTH_SHORT).show(); 
    } 

    class MyGestureDetector extends SimpleOnGestureListener{ 

     // Detect a single-click and call my own handler. 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      ListView lv = getListView(); 
      int pos = lv.pointToPosition((int)e.getX(), (int)e.getY()); 
      myOnItemClick(pos); 
      return false; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH) 
       return false; 
      if(e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE && 
       Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) { 
       onRTLFling(); 
      } else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE && 
       Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) { 
       onLTRFling(); 
      } 
      return false; 
     } 

    } 

    private static final String[] m_Starbucks = { 
     "Latte", "Cappuccino", "Caramel Macchiato", "Americano", "Mocha", "White Mocha", 
     "Mocha Valencia", "Cinnamon Spice Mocha", "Toffee Nut Latte", "Espresso", 
     "Espresso Macchiato", "Espresso Con Panna" 
    }; 
} 
+1

спасибо за обмен :-) – Ads

+0

хороший. Благодарю. – dierre

+0

@wwyt, Работает как шарм !! Спасибо buddy но, есть ли какой-либо способ без расширения ListActivity? потому что мне нужно расширить какой-то другой класс –

2

--Edited --- Если вы пришли сюда из Google, просто хочу вам сказать, что, хотя это решение до сих пор работает, что конкретный конструктор GestureDetector является устаревшим.

Если вы хотите реализовать салфетки жесты на андроид приложение, которое вы могли бы рассмотреть вопрос об использовании этой библиотеки: https://github.com/liuzc/android-swipelistview

Или этот (пойло работать так же, как Gmail): https://github.com/nhaarman/ListViewAnimations

+0

Это утверждение неверно. Пожалуйста, ознакомьтесь с документацией, к которой вы подключились. – carlrice

+0

спасибо, что просто отредактировал его – golfadas

+1

первая ссылка больше не работает, может быть, вы имели в виду это https://github.com/liuzc/android-swipelistview – Mitro

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