android-ListView错误中带有onFocusChangeListener的EditText

android-ListView错误中带有onFocusChangeListener的EditText,android,listview,android-listview,android-edittext,Android,Listview,Android Listview,Android Edittext,我有一个列表视图,我为它定制了一个适配器。列表中的某些项有一个EditText,我为它设置了onfocuschangesetener,以存储在其中键入的数据 问题是: 从列表视图聚焦编辑文本,显示软键盘后,该编辑文本的聚焦将丢失。可以通过再次选择它来聚焦。我如何避免这种情况 自定义适配器中的getView()方法: @Override public View getView(final int position, View convertView, ViewGroup parent) {

我有一个
列表视图
,我为它定制了一个适配器。列表中的某些项有一个
EditText
,我为它设置了
onfocuschangesetener
,以存储在其中键入的数据

问题是: 从
列表视图
聚焦
编辑文本
,显示软键盘后,该
编辑文本
的聚焦将丢失。可以通过再次选择它来聚焦。我如何避免这种情况

自定义适配器中的
getView()
方法:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;
        int type = getItemViewType(position);

        if(convertView == null)
        {
            holder = new ViewHolder();
            switch(type)
            {
                case NORMAL:

                    convertView = inflater.inflate(R.layout.list_item_edit_content, parent, false);
                    holder.title = (TextView) convertView.findViewById(R.id.rowName);
                    holder.input = (EditText) convertView.findViewById(R.id.input);
                    break;
                case SPECIAL:/* some code */
                    break;
            }
        convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        switch(type)
        {
        case NORMAL:
            holder.title.setText(columnNames.get(position));
            holder.input.setText(data.get(position));
            holder.input.setId(position);
            holder.input.setOnFocusChangeListener(new OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    final int pos = v.getId();
                    EditText txt = (EditText) v;
                        data.set(pos, txt.getText().toString());
                }
            });
            break;
        case SPECIAL: /* some other code */ 
            break;
        }


        return convertView;
    }
列表项编辑内容.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#11000000"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/rowName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:textColor="#0000ff" >
        <requestFocus />
    </EditText>

</LinearLayout>

我的观点是,当显示键盘时,问题在于活动娱乐。通过在AndroidManifest.xml中添加以下内容来防止此情况:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustPan"
          android:label="@string/app_name">

我还没有机会复制并运行此代码,但我可以马上告诉您,我发现在ListView和适配器方面不信任“view.getId()”方法

即使以编程方式从ListView中检索子对象,然后运行child.getId()也不可靠

我对它没有返回ID“what we think is the view”有很多问题,因为适配器重复使用视图,这使事情变得复杂

我将研究这些方法:“hasFocus”和“requestFocus”。其他一些视图或视图组正在获得焦点。 尝试:

找出哪个视图正在获得焦点,然后从那里开始


它们对我来说非常有用并且向后兼容。

我不确定它是否能解决您的问题,但您的onFocusChange事件可能需要考虑hasFocus。否则,当您获得焦点或失去焦点时(除非这是您想要的),它将执行该事件xml@GregEnnis我想你指的是安卓:focusable=“false”,在这种情况下,它不起作用。我还从xml中删除了,但它仍然不起作用。是的,我只是把它放在一个注释中,因为我不知道它是否会起作用。我认为问题也存在,但我还不知道如何让它按预期的方式工作(我是java和android新手)我在决定布局设计时已经试过了,adjustPan会将列表中的最后几项放在软键盘后面。
    Log.i("TAG", "View with focus = " + getCurrentFocus());
    Log.i("TAG", "View with focus = " + getCurrentFocus().getId());