用户完成/暂停键入时如何使用TextWatcher?

时间:2015-10-16 09:29:18

标签: android retrofit autocompletetextview textwatcher

我遇到了一个优化问题:我想做一个动态的AutoCompleteTextView,所以我实现了#34; TextWatcher"到我的班级。我希望每次用户输入并暂停或完成输入时,我都会启动我的数据库请求以获取自动填充列表,所以我的问题是:

我如何知道用户何时在AutoCompleteTextView中完成/暂停输入?

实际上,每次用户输入一个字符时,我的代码都会发出请求。所以对于"你好"它会向我的数据库发送4个请求,但是我需要它向完整的世界发送一个独特的请求"你好"当用户完成输入时。

这可能吗?

这是我实际代码的一部分:

public class MainActivity extends AppCompatActivity implements TextWatcher {

public final static String CLUB_NAME = "com.mycompany.myfirstapp.FAV_CLUB";

List<devaddict.footbarcom.modelPOJO.Object> list;
Button searching;
AutoCompleteTextView searchbar_club;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    searching = (Button)findViewById(R.id.buttonseek);
    searchbar_club = (AutoCompleteTextView) findViewById(R.id.searchbar_club);

    searchbar_club.addTextChangedListener(this);
    searchbar_club.setThreshold(3);

}

然后,在同一&#34; MainActivity&#34;上课,下面我得到了论文:

@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {

    System.out.println("TEXT CHANGED BY onTextChanged");

}

@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {

}

@Override
public void afterTextChanged(final Editable s) {
  //System.out.println("TEXT CHANGED BY afterTextChanged");
}

我认为&#34; afterTextChanged&#34;方法将是我真正想要的,但我没有看到它和onTextChanged之间的任何区别。

System.out仅用于测试。

3 个答案:

答案 0 :(得分:3)

onTextChanged()是您可以记下逻辑的主要方法。 如果您愿意等待用户输入2个或更多单词,您可以编写onTextChanged()方法,如下所示:

@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {

 if(count > 4){
     new Handler().postDelayed(new Runnable(){
          public void run(){
               //write db insertion logic here...
        }},700);
   }
}

基本上你等待700毫秒然后做一些动作以确保用户可能已经停止输入..

看看这有帮助!!

P.S:阿里在下面使用计时器的答案也是解决OP问题的正确方法

答案 1 :(得分:1)

    Timer timer;

    @Override
    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {

    timer = new Timer();
    timer.schedule(new TimerTask()
    {
        @Override
        public void run()
        {
            MainActivity.activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    timer.cancel();
                    //do something

                }
            });
        }

    }, 1000);//after 1 second do whatever you want

}

@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {

}

@Override
public void afterTextChanged(final Editable s) {
  //System.out.println("TEXT CHANGED BY afterTextChanged");
}

答案 2 :(得分:0)

以下是使用Kotlin和Coroutines的方法: 首先在“活动”或“片段”中定义用于执行此操作的作业,如下所示:

private var textChangeCountDownJob: Job = Job()

然后添加这样的文本查看器:

editText.doAfterTextChanged {
            textChangeCountDownJob.cancel()
            textChangeCountDownJob = lifecycleScope.launch {
                delay(500) // for half a second delay, as an example
                search(it.toString()) // doing your logic here
            }
        }