2013-02-02 31 views
9

我有一个EditText来筛选它下面的ListView中的项目,通常它可能包含超过1000个项目。该TextWatcher是:如何让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) { 
} 
}); 

的这里的问题是,由用户输入的每个字母,名单越来越刷新,这是导致该UI是缓慢的重复这个列表更新。

如何让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

当我检查LogCat现在,我注意到,虽然处理仅在2秒后发生,Runnable运行多次。例如,如果我输入“sof”,fillItemList将运行3次 - 's','so'和'sof'。我认为Handler.removeCallbacks会照顾它,但事实并非如此。 – desidigitalnomad

+0

@rbH你确定吗?你打字速度够快吗? – Luksprog

0

使用RxBinding

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