2010-10-13 14 views
13

नमस्ते मुझे अपनी सूचीदृश्य में एक इशारा जोड़ना है, मैं संपर्क अनुप्रयोग की समान कार्यक्षमता को कार्यान्वित करना चाहता हूं। जब मैंने स्वाइप छोड़ा तो उसे एक संदेश भेजना चाहिए, इसे स्वाइप करना चाहिए इसे कॉल करना चाहिए। क्या कोई मेरी मदद कर सकता है कि उन इशारा पहचान कैसे करें ... मैंने इसे कई अन्य विचारों में लागू किया है ... लेकिन मैं सूची दृश्य के लिए नहीं कर सका ... मैं क्या नहीं कर रहा हूं ... मेरा कोड `सूचीदृश्य एंड्रॉइड में इशारा

/** 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

[कैसे लागू करने के लिए फ़्लिंग के संभावित डुप्लिकेट एंड्रॉइड लिस्टव्यू में] (http://stackoverflow.com/questions/4030389/how-to-implement-fling-in-android-listview) –

उत्तर

46

से [# 937,313] पोस्ट [1] (धन्यवाद gav और paiego करने के लिए जाना) जवाब के आधार पर, मैं ListView पर सरल इशारों (क्षैतिज स्वाइप) पहचान करने के लिए निम्नलिखित कोड तक मार पड़ी है।

हालांकि, एक फ़्लिंग ऑपरेशन के बाद, ListView के onItemClick() श्रोता को भी बुलाया जाएगा! इसलिए, आप एक fling और एक अतिरिक्त onItemClick() पर समाप्त होता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि एंड्रॉइड प्रत्येक बटन-अप पर एक आइटम-क्लिक ईवेंट भेजता है, इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता ने अपनी उंगली कितनी दूर की है। इसका समाधान करने के लिए, सामान्य 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, एक आकर्षण की तरह काम करता है !! धन्यवाद दोस्त लेकिन, क्या ListActivity को विस्तार किए बिना कोई तरीका है? क्योंकि मुझे कुछ अन्य वर्ग –

2

--Edited --- यदि आप गूगल से यहाँ आया, बस आपको बताना है कि हालांकि इस समाधान अभी भी काम करता है, GestureDetector की है कि विशिष्ट निर्माता अब मान्य नहीं है चाहता हूँ। https://github.com/liuzc/android-swipelistview

या यह एक (स्वाइप बस जीमेल की तरह काम करते हैं):

आप अपने android ऐप पर स्वाइप जेस्चर लागू करना चाहते हैं तो आप इस लाइब्रेरी का उपयोग पर विचार कर सकते https://github.com/nhaarman/ListViewAnimations

+0

यह कथन गलत है। कृपया आपके द्वारा लिंक किए गए दस्तावेज़ को पढ़ें। – carlrice

+0

धन्यवाद आदमी ने इसे अभी संपादित किया है – golfadas

+1

पहला लिंक अब और काम नहीं करता है, शायद आपका मतलब यह है कि https://github.com/liuzc/android-swipelistview – Mitro