在ListView的notifyDataSetChanged之后,editText.requestFocus无法正常工作(listview外部的edittext)

时间:2017-07-10 01:39:42

标签: android listview focus

我遇到了问题:

我的布局很简单,只有editText和listView(两者都是分开的)。与其他线程中的其他情况不同,我的editText位置位于listView之上。

  

现在我有问题,如何在之后请求编辑文本   通过adapter.notifyDataSetChanged()更新listView数据; ?

我把requestFocus代码放在这里:

editText.setOnKeyListener(new View.OnKeyListener()
        {
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN)
                {
                    switch (keyCode)
                    {
                        case KeyEvent.KEYCODE_ENTER:{
                            adapter.notifyDataSetChanged();
                            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

                            return true;
                        }
                        default:{
                            break;
                        }
                    }

                    editText.setFocusableInTouchMode(true);
                    editText.requestFocus();
                    System.out.println("FOCUS GET");
                }
                return false;
            }
        });
doAddToList里面的最后一个代码是adapter.notifyDataSetChanged();. System.out.println结果显示了几次" FOCUS GET"在控制台上,但焦点不适用于EditText。

2 个答案:

答案 0 :(得分:2)

我认为当你调用notifyDataSetChanged()时会发生很多处理,这就是你忽略对editText.requestFocus()的调用的原因。

在notifyDataSetChanged()调用

之后尝试使用此代码
recyclerView.post(new Runnable() {
     @Override
     public void run(){
        editText.requestFocus();
     }
});

OR

editText.post(new Runnable() {
     @Override
     public void run(){
        editText.requestFocus();
     }
});  

编辑:尝试(根据需要调整延迟时间) -

recyclerView.postDelayed(new Runnable() {
 @Override
 public void run(){
    editText.requestFocus();
 }

},1000);

希望这有帮助

答案 1 :(得分:1)

您正在onKeyListener中添加requestFocus。首先,Android中的极少数键盘发送关键事件(大多数使用更高级别的API),因此它可能无论如何都不会触发。只有硬件按钮始终发送键事件。其次,即使键盘发送了关键事件,它也必须已经打开,你输入该行才能执行。

如果要在每次调用notifyDataSetChanged时设置焦点,请在每次调用notifyDataSetChanged后调用setFocus。把它放在你拥有的地方甚至都不是很接近,而且我无法弄清楚你的逻辑是否正确。