android - 在ListView错误中使用onFocusChangeListener的EditText

时间:2014-12-30 21:06:12

标签: android listview android-listview android-edittext

我有一个ListView,我为此制作了自定义适配器。列表中的某些项目有一个EditText,我设置onFocusChangeListener来存储输入的数据。

问题是: 在显示软键盘后,从EditText聚焦ListView,将失去对EditText的关注。可以通过再次选择它来集中注意力。我该如何避免这种情况?

自定义适配器中的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;
    }

list_item_edit_content.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>

2 个答案:

答案 0 :(得分:0)

我的观点是问题在于显示键盘时的活动娱乐。通过添加AndroidManifest.xml来防止这种情况:

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

答案 1 :(得分:0)

我还没有机会复制并运行这段代码,但是当我发现ListViews和Adapters时,我发现我不相信“view.getId()”方法。 。

甚至以编程方式从ListView中检索子项然后运行child.getId()从来都不可靠。

我遇到了很多问题,它没有返回“我们认为是视图”的ID,因为适配器重新使用了使事情变得复杂的视图。

我会研究方法:“hasFocus”和“requestFocus”。其他一些View或ViewGroup正在获得焦点。 试试:

    Log.i("TAG", "View with focus = " + getCurrentFocus());
    Log.i("TAG", "View with focus = " + getCurrentFocus().getId());   

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

它们已被证明非常有用并且向后兼容我。