ListView 在重新加载后从 EditText 窃取焦点

ListView stealing focus form EditText after reload

所以我在它下面有一个 EditText 和一个 ListView。我正在监听要按下的 KEYCODE_ENTER,之后,我将一个条目添加到列表视图的适配器并调用 notifyDataSetChanged() 方法。令人惊讶的是,在那之后,列表视图中的第一个项目变得聚焦而不是之前聚焦 EditText.

这是我的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:imeOptions="actionSearch"
        android:singleLine="true"/>

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

这是我按下回车键时的操作

mTextEdit.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {


            // modifying data set
            onScanDataReceived(mTextEdit.getText().toString().trim());

            BaseAdapter adapter = (BaseAdapter) mListView.getAdapter();

            adapter.notifyDataSetChanged();

            mTextEdit.setText(null);

            return true;
        }

        return false;
    }
});

问题显然与列表视图重新加载有关,因为当我注释掉行 adapter.notifyDataSetChanged(); 时,焦点仍在 EditText.

重载 ListView 后,有什么方法可以让焦点保持在 EditText 上吗?

P.S。重新加载数据后,我尝试在 editText 上调用 requestFocus() 无济于事。

试试这个

mTextEdit.setFocusableInTouchMode(true);
mTextEdit.requestFocus();

如果你也想用软键盘获得焦点。在上面的代码之后写下面的代码

final InputMethodManager inputMethodManager = (InputMethodManager) context
            .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(mTextEdit, InputMethodManager.SHOW_IMPLICIT);

试试这个,

mTextEdit.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {


                // modifying data set
                onScanDataReceived(mTextEdit.getText().toString().trim());

                BaseAdapter adapter = (BaseAdapter) mListView.getAdapter();

                adapter.notifyDataSetChanged();

                mTextEdit.setText(null);
                Handler mHandler = new Handler();
                mHandler.postDelayed(
                        new Runnable() {
                            @Override
                            public void run() {
                                mTextEdit.requestFocus();
                            }
                        }
                        , 50 // 50...for delay in my case
                );

                return true;
            }

            return false;
        }
    });