2013-02-02 48 views
9

मेरे पास में आइटम को फ़िल्टर करने के लिए EditText है, जिसमें आमतौर पर 1000 से अधिक आइटम हो सकते हैं। TextWatcher है:कुछ कार्रवाई करने से पहले कुछ समय के लिए टेक्स्टवॉचर का इंतजार कैसे करें

txt_itemSearch.addTextChangedListener(new TextWatcher() { 

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    fillItemList(); 
} 
public void afterTextChanged(Editable s) { 
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
} 
}); 

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

मैं TextWatcher 1-2 सेकंड के लिए प्रतीक्षा कैसे कर सकता हूं और यदि 2 सेकंड के बाद कोई इनपुट नहीं होता है, तो सूची फ़िल्टर करें। कोई सुझाव लोग?

+1

* कोई सुझाव लोग * - एडाप्टर के 'getFilter (का उपयोग करते हुए' ListView' छानने का उचित तरीके से उपयोग) 'विधि। – Luksprog

+0

ठीक है, लेकिन फ़िल्टरिंग जटिल है। मुझे फ़िल्टर किए जाने के लिए कुछ चेकबॉक्स और अन्य पैरामीटर भी मिल गए हैं, इसलिए मेरा एकमात्र विकल्प SQLite क्वेरी के माध्यम से प्राप्त करना है। – desidigitalnomad

उत्तर

16

मैं कैसे textWatcher 1-2 सेकेंड के लिए प्रतीक्षा करें और अगर कोई और अधिक इनपुट 2 सेकेंड के बाद क्या होता है, तो सूची को फ़िल्टर कर सकते हैं।

जैसा कि मैंने पहले ही टिप्पणी में कहा है, आपको एडाप्टर की getFilter() विधि का उपयोग करना चाहिए। चूंकि यह उपयुक्त नहीं हो सकता है (जैसा कि आप कहते हैं) उसी तंत्र को लागू करने का प्रयास करें, एडाप्टर का फ़िल्टर फिल्टर इनपुट के बीच रद्द करने के लिए उपयोग करता है।

private Handler mHandler = new Handler(); 

public void afterTextChanged(Editable s) { 
     mHandler.removeCallbacks(mFilterTask); 
     mHandler.postDelayed(mFilterTask, 2000); 
} 

जहां filterTask है:

Runnable mFilterTask = new Runnable() { 

    @Override 
    public void run() { 
      fillItemList(); 
    }  
} 
+1

यह काम किया! अब दूध के रूप में चिकना। धन्यवाद! – desidigitalnomad

+0

जब मैंने लॉगकैट की जांच की, तो मैंने देखा कि हालांकि प्रसंस्करण केवल 2 सेकंड के बाद होता है, रननेबल कई बार चलता है। उदाहरण के लिए, यदि मैं 'sof' टाइप करता हूं, तो fillItemList 3 बार- 's', 'so' और 'sof' के लिए चलाता है। मैंने सोचा कि हैंडलर.removeCallbacks इसका ख्याल रखेंगे, लेकिन ऐसा नहीं हुआ। – desidigitalnomad

+0

@ आरबीएच क्या आप इसके बारे में निश्चित हैं? क्या आप पर्याप्त तेज़ी से टाइप कर रहे हैं? – Luksprog

0

RxBinding का उपयोग करते हुए:

RxTextView.textChanges(edittext) 
      .skipInitialValue() 
      .debounce(TIME_TO_WAIT, TimeUnit.MILLISECONDS) 
      .subscribe({ 
       //do the thing 
      }) 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^