2011-01-13 22 views
10

पर जेस्चर का पता लगाने में समस्या मेरे पास एक गतिविधि है जिसमें व्यूफ्लिपर है। व्यूफ्लिपर में 2 लेआउट शामिल हैं, जिनमें से दोनों अनिवार्य रूप से केवल सूची दृश्य हैं।ListView

तो यहां विचार यह है कि मेरे पास दो सूचियां हैं और एक से दूसरे में नेविगेट करने के लिए मैं एक क्षैतिज स्वाइप का उपयोग करूंगा।

मेरे पास यह काम है। हालांकि, जब स्वाइप निष्पादित करना शुरू होता है तो आपकी अंगुली की सूची कभी भी सूचीबद्ध होती है, उस आइटम को भी लंबे समय से क्लिक किया जाएगा।

यहाँ प्रासंगिक कोड रहा है:

public class MyActivity extends Activity implements OnItemClickListener, OnClickListener { 

    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    private GestureDetector mGestureDetector; 
    View.OnTouchListener mGestureListener; 

    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) { 
        if (mCurrentScreen != SCREEN_SECONDLIST) { 
         mCurrentScreen = SCREEN_SECONDLIST; 
         mFlipper.setInAnimation(inFromRightAnimation()); 
         mFlipper.setOutAnimation(outToLeftAnimation()); 
         mFlipper.showNext(); 
         updateNavigationBar(); 
        } 
       } 
       else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        if (mCurrentScreen != SCREEN_FIRSTLIST) { 
         mCurrentScreen = SCREEN_FIRSTLIST; 
         mFlipper.setInAnimation(inFromLeftAnimation()); 
         mFlipper.setOutAnimation(outToRightAnimation()); 
         mFlipper.showPrevious(); 
         updateNavigationBar(); 
        } 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return true; 
     } 
    } 

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





    ViewFlipper mFlipper; 

    private int mCurrentScreen = SCREEN_FIRSTLIST; 

    private ListView mList1; 
    private ListView mList2; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.layout_flipper); 

     mFlipper = (ViewFlipper) findViewById(R.id.flipper); 

     mGestureDetector = new GestureDetector(new MyGestureDetector()); 
     mGestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (mGestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 

     // set up List1 screen 

     mList1List = (ListView)findViewById(R.id.list1); 
     mList1List.setOnItemClickListener(this); 
     mList1List.setOnTouchListener(mGestureListener); 

     // set up List2 screen 
     mList2List = (ListView)findViewById(R.id.list2); 
     mList2List.setOnItemClickListener(this); 
     mList2List.setOnTouchListener(mGestureListener); 

    } 

    … 
} 

अगर मैं बदल "return true;" जेस्चर डिटेक्टर से "झूठी वापसी" के लिए कथन, मुझे लंबे समय तक क्लिक नहीं मिलते हैं। दुर्भाग्यवश, मुझे नियमित क्लिक मिलते हैं।

क्या कोई जानता है कि मैं इसके आसपास कैसे हो सकता हूं?

उत्तर

7

बस एक पूरी तरह से अलग दृष्टिकोण के साथ एक पूरी तरह से अलग जवाब में फेंक ...

मैं SwipeView नामक एक कस्टम दृश्य कर दिया है, यह खुला स्रोत आदि आदि, ऐसा ऐसा है। यह तुम क्या आप के रूप में बस के रूप में क्या करने जा चाहते हैं देना चाहिए:

mSwipeView.addChild(myList1); 
mSwipeView.addChild(myList2); 

आप इशारा डिटेक्टरों या कुछ भी साथ के बारे में गड़बड़ करने की जरूरत नहीं होगी, और कड़ी चोट के रूप में आप यह कर अपनी उंगली का पालन करना चाहिए ..

(यह एक भयानक भयानक विज्ञापन की तरह पढ़ता है, कृपया मुझे क्षमा करें।यह एक लंबा दिन हो गया है;)

कुछ अद्भुत लिंक है:

http://jasonfry.co.uk/?id=23

http://jasonfry.co.uk/?id=24

http://jasonfry.co.uk/?id=28

+0

यह एक घटक मैं हाल ही में विकसित करने के लिए समान है, सिवाय इसके कि मैं मेरा और करने के लिए दृश्य रीसाइक्लिंग जोड़ा अपने एक सूची द्वारा समर्थित एडाप्टर। असल में, मैंने ListView कोड का एक समूह बनाया और इसे आपके द्वारा किए गए एक कस्टम इशारे को क्षैतिज स्क्रॉल व्यू से जोड़ा। – jfelectron

+0

हाँ मैं इसे स्वाइप व्यू में जोड़ने पर भी काम कर रहा हूं! इसके अलावा, मैं तो बस (शाब्दिक बस, के बारे में 2 मिनट पहले) देखा वहाँ एक SwipeView पर listviews साथ एक बग है कि। अब मैं बग तय की और Git रेपो अद्यतन किया है। https://github.com/fry15/uk.co.jasonfry.android.tools – jsonfry

+3

jfelectron हालांकि GitHub पर तुम्हारा है? –

0

[संपादित करें] स्क्रैच करें, पूरी तरह गलत है।

मुझे लगता है कि आपको इस भाग को अपडेट करना होगा, और पता लगाएं कि क्या आप बाएं या दाएं स्क्रॉल कर रहे थे, और अगर आप स्वाइपिंग स्थिति में थे तो सत्य वापस आएं। या कम से कम वह जगह है जहां मैं पहले देखता हूं।

mGestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (mGestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 

मेरी गरीब उदाहरण के साथ सतत, खेद है।

ऑन टच में मुझे विश्वास है कि आप event.getAction() का परीक्षण कर सकते हैं और यह निर्धारित कर सकते हैं कि एक लंबा क्लिक हुआ है या नहीं। यदि यह है, और आप एक झुकाव गति में, तो लंबे क्लिक पर कब्जा करने के लिए सच वापस आते हैं।

डर यह एक निश्चित उत्तर से अधिक सुझाव है।

क्या आपने अन्य [विधियों] पर भी जांच की है कि आप SimpleOnGestureListener से ओवरराइड कर सकते हैं। बस की जाँच की और

@Override 
public void onLongPress(MotionEvent e) { 
    // TODO Auto-generated method stub 
    super.onLongPress(e); 
} 

कुछ आप के साथ प्रयोग कर सकता है हो सकता है।

+0

है कि क्या हो रहा है। या आपका उदाहरण है कि आपका EDIT क्या अमान्य करने का इरादा रख रहा है? – Andrew

+0

क्षमा करें, यह एक भयानक उदाहरण है, एक और मुद्दा तय कर रहा है। बाद में बेहतर कोशिश करेंगे और समझाएंगे। – Emile

1

चूंकि आप GestureDetector का उपयोग कर रहे हैं, तो करने के लिए काम लंबे समय तक हैंडलिंग के लिए SimpleGestureDetector.onLongPress(MotionEvent e) लागू करना है। हालांकि, आप सूची सूची को नहीं जानते हैं जो वहां से लंबे समय से दबाया गया है, इसलिए आपको इसे सामान्य onItemLongClick() से याद रखना होगा।

class MyGestureDetector extends SimpleOnGestureListener { 
    ... 
    @Override public void onLongPress(MotionEvent e) { 
     if (longClickedItem != -1) { 
      Toast.makeText(MainActivity.this, "Long click!", Toast.LENGTH_LONG).show(); 
     }   
    } 
} 

int longClickedItem = -1; 

@Override 
public boolean onItemLongClick(AdapterView<?> list, View view, int position, long id) { 
    longClickedItem = position; 
    return true; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    // Reset longclick item if new touch is starting 
    if (event.getAction()==MotionEvent.ACTION_DOWN) { 
     longClickedItem = -1; 
    } 

    if (mGestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 

मैंने इसका परीक्षण किया है और ऐसा लगता है कि यह ठीक काम करता है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे इसे एक मौका और देना होगा। मुझे ध्यान रखना चाहिए कि एक लंबी प्रेस के दौरान सक्रिय किया जा रहा है और जो मैंने देखा है, मैं वास्तव में क्या करना चाहता हूं, अगर कोई स्वाइप कर रहा है तो कोई इशारा रिसाव नहीं है। कुछ अन्य मुद्दे हैं, खासकर एंड्रॉइड फोन के साथ जो आईफोन एंड-ऑफ-लिस्ट एनीमेशन और ऐसे कर सकते हैं। असली समस्या यह है कि स्वाइपिंग सूची में अन्य इशारा भेज रही है; और मुझे नहीं पता कि इसे कैसे रोकें। – Andrew

+0

मैंने अभी यह कोशिश की है और जब मैं स्वाइप करता हूं तो यह लंबे क्लिक को निष्पादित करने से रोकता है, हालांकि आपकी उंगली जिस वस्तु पर उत्पन्न होती है वह पीले रंग को हाइलाइट करती है; इतना इशारा के कुछ टुकड़ा स्पष्ट रूप से सूची – Andrew

+0

को लीक, बुला list.cancelLongPress() यदि इशारा डिटेक्टर सच रिटर्न का प्रयास करें ... –

1

आप अपने gestureDetector जाओ और

mGestureDetector.setIsLongpressEnabled(false); 

सेट यह लंबे प्रेस घटनाओं को पहचानने से रोक देगा।

0

मैंने क्षैतिज स्क्रॉलव्यू से व्युत्पन्न एक कस्टम घटक विकसित किया जो ऐसा करता है। मेरे पास सूची दृश्य है क्योंकि बच्चे के विचार और लंबी प्रेस के बिना स्वाइप करें। यह एक सूची एडाप्टर द्वारा समर्थित है, जो आप चाहते हैं कि कुछ भी हो सकता है (ArrayAdapter, कर्सर एडाप्टर ...)। यह तीन बच्चे के विचारों को लोड करता है और फिर फ़्लिपिंग पर, बस उन्हें किसी भी तरफ स्वैप करता है। इनमें से अधिकांश को सूची दृश्य से जोड़ा गया है और इसे दोबारा करने की जरूरत है। यहां सीधे पोस्ट करने का तरीका बहुत लंबा है।

http://pastie.org/1480091

0

निकालें अपने getListView().setOnItemLongClickListener

अपनी कक्षा MyGestureDetector में जोड़ें:

public void onLongPress(MotionEvent e) { 
    final int position = getListView().pointToPosition((int) e.getX(), 
      (int) e.getY()); 
    // what you want do 
    super.onLongPress(e); 
}