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

时间:2016-05-06 18:12:19

标签: android listview android-edittext focus

所以我有一个EditText和一个ListView。我正在监听KEYCODE_ENTER被按下,之后,我在listview的适配器中添加了一个条目并调用了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;
    }
});

问题很明显在于listview重新加载,因为当我注释掉adapter.notifyDataSetChanged();行时,焦点仍在EditText上。

重新加载EditText后,是否有任何方法可以将注意力集中在ListView上?

P.S。我在重新加载数据后无法使用editText调用requestFocus()

2 个答案:

答案 0 :(得分:0)

试试这个

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

如果你想要与软键盘一起使用。在上面的代码

之后写下面的代码
final InputMethodManager inputMethodManager = (InputMethodManager) context
            .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(mTextEdit, InputMethodManager.SHOW_IMPLICIT);

答案 1 :(得分:0)

试试这个,

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;
        }
    });