奇怪的ListView错误

时间:2011-06-26 01:15:41

标签: android

我正在使用ListView实现一个表单。 ListView中的每一行都包含一个与描述输入类型的TextView相关联的EditText,因此被定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">

    <TextView android:id="@+id/textFormItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="16sp"
        android:ellipsize="end" android:singleLine="true" />

    <EditText android:id="@+id/editFormItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:scrollHorizontally="true" />
</LinearLayout>

我正在实现一个子类SimpleAdapter的自定义适配器。到目前为止,代码看起来像这样:

public class FormAdapter extends SimpleAdapter {
    public static final String KEY = "key";

    static final String[] FROM = { KEY };
    static final int[] TO = { R.id.textFormItem };

    private static ICUApplication app;

    private FormAdapter(Context context, List<? extends Map<String, ?>> data) {
        super(context, data, R.layout.form_item, FROM, TO);

        setViewBinder(VIEW_BINDER);
    }

    public static FormAdapter createAdapter (Context ctx, Set<String> dataTypeSet) {
        List<Map<String,String>> data = 
                new ArrayList<Map<String,String>>(dataTypeSet.size());

        for (String dataType : dataTypeSet) {
            Map<String,String> map = new HashMap<String,String>();
            map.put(KEY, dataType);
            data.add(map);
        }

        app = (ICUApplication) ctx.getApplicationContext();

        return new FormAdapter(ctx, data);
    }

    static final SimpleAdapter.ViewBinder VIEW_BINDER = new SimpleAdapter.ViewBinder() {

        @Override
        public boolean setViewValue(View view, Object data,
                String textRepresentation) {
            int viewId = view.getId();
            switch (viewId){
            case R.id.textFormItem:
                String key = (String) data;
                ((TextView) view).setText(app.getTypeNameForKey(key));
            }

            return true;
        }
    };
}

一些注意事项:我实现视图绑定器的原因是我希望ListView显示数据类型的用户友好名称(由app.getTypeNameForKey(key)给出),同时在内部按{{1}存储每一行}}。此外,目前使用这两个类的Activity只有将ListView设置为使用此适配器的代码。

早些时候,由于EditText焦点问题很难弄清楚究竟发生了什么,我使用前面提到的问题解决了这个问题:Focusable EditText inside ListView。目前,我在表单中有三个项目。所以,这是一个奇怪的错误:

  • 如果我点击第一个EditText,屏幕键盘将打开,焦点转移到第三个EditText。在我关闭键盘后,我在第三个EditText中输入的任何内容都将被移回第一个EditText。
  • 如果我点击第二个EditText,键盘将打开并再次聚焦切换到第三个EditText。我在第三个框中键入的内容将被移动,而不是第二个EditText,而是第一个。
  • 如果我点击第三个EditText,焦点不会移动,但在关闭键盘后,输入会移动到第一个EditText。
  • 与上述三个相关的其他一些奇怪的问题我不会在这里列出,因为它会使这个已经很长的问题过长。

关于为什么会发生这种情况以及如何解决这个问题的任何想法?

0 个答案:

没有答案