【问题标题】:How to make TextWatcher wait for some time before doing some action如何让 TextWatcher 在执行某些操作之前等待一段时间
【发布时间】:2013-01-17 14:40:51
【问题描述】:

我有一个EditText 来过滤它下面ListView 中的项目,通常可能包含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) {
}
});

这里的问题是,随着用户输入的每个字母,列表都会刷新,正是这种重复的列表更新导致 UI 变慢。

如何让TextWatcher 等待 1-2 秒,如果 2 秒后没有更多输入,则过滤列表。有什么建议吗?

【问题讨论】:

  • 有什么建议吗? - 使用适配器的getFilter() 方法过滤ListView。
  • 好的,但是过滤有点复杂。我还有几个复选框和其他要过滤的参数,所以我唯一的选择是通过 SQLite 查询来获取它。

标签: android android-listview android-edittext textwatcher


【解决方案1】:

如果没有更多输入,如何让 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();
     }       
}

【讨论】:

  • 当我现在检查 LogCat 时,我注意到虽然处理只在 2 秒后发生,但 Runnable 运行了很多次。例如,如果我输入“sof”,fillItemList 会运行 3 次 - 用于“s”、“so”和“sof”。我以为 Handler.removeCallbacks 会处理它,但它没有。
  • @rbH 你确定吗?你打字够快吗?
  • 糟糕!。我的错。我将 mFilterTask 放在 afterTextChanged 中,因此每次都会创建一个新的可运行对象。现在比牛奶还滑:) 谢谢
【解决方案2】:

使用RxBinding:

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

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2011-08-13
    • 2012-02-25
    • 2018-02-07
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多