为什么android SimpleCursorAdapter bindView复制第一行?

时间:2012-06-22 19:19:42

标签: android simplecursoradapter

我已经扩展了SimpleCursorAdapter并且遇到了一个奇怪的问题,看起来在第一行调用了两次。

只有第一行似乎是重复的。我有一种感觉它与光标的定位方式有关,但已查看了所有的适配器类,似乎无法找到它发生的位置。

这是我的bindView代码,我插入了一些日志来显示我所看到的内容。

@Override
public void bindView(View view, Context context, Cursor cursor) {
    final ViewBinder binder = getViewBinder();
    final int count = mTo.length;
    final int[] from = mFrom;
    final int[] to = mTo;

    Log.v("builder", "cursor count"+cursor.getCount() );

    Log.v("builder", "mTo.length"+count);
    //Bind all Views
    for (int i = 0; i < count; i++) {
        final View v = view.findViewById(to[i]);
        if (v != null) {
            boolean bound = false;
            if (binder != null) {
                bound = binder.setViewValue(v, cursor, from[i]);
            }

            if (!bound) {
                String text = cursor.getString(from[i]);
                v.setVisibility(View.VISIBLE);
                if (text == null && !(v instanceof ImageView)) {
                    text = "";
                    v.setVisibility(View.GONE);
                } 

                if (v instanceof TextView) {
                    setViewText((TextView) v, text);
                    if (v instanceof EditText){
                        EditText et = (EditText) v;
                        Log.v("builder", "setting up edittext"+cursor.getPosition()+i);
                    //  setUpEditors(view, et);
                    }
                } else if (v instanceof ImageView) {
                    setViewImage((ImageView) v, text);
                } else {
                    throw new IllegalStateException(v.getClass().getName() + " is not a " +
                            " view that can be bound by this SimpleCursorAdapter");
                }


            }
        }
    }


}

这是我的输出,光标中只有一个项目

06-22 15:15:03.797: V/builder(27573): cursor count1
06-22 15:15:03.797: V/builder(27573): mTo.length5
06-22 15:15:03.807: V/builder(27573): setting up edittext02
06-22 15:15:03.807: V/builder(27573): setting up edittext03
06-22 15:15:03.807: V/builder(27573): setting up edittext04
06-22 15:15:03.887: V/builder(27573): cursor count1
06-22 15:15:03.887: V/builder(27573): mTo.length5
06-22 15:15:03.897: V/builder(27573): setting up edittext02
06-22 15:15:03.897: V/builder(27573): setting up edittext03
06-22 15:15:03.907: V/builder(27573): setting up edittext04

这里有2个项目

06-22 15:17:28.337: V/builder(27573): cursor count2
06-22 15:17:28.337: V/builder(27573): mTo.length5
06-22 15:17:28.337: V/builder(27573): setting up edittext02
06-22 15:17:28.337: V/builder(27573): setting up edittext03
06-22 15:17:28.337: V/builder(27573): setting up edittext04
06-22 15:17:28.417: V/builder(27573): cursor count2
06-22 15:17:28.417: V/builder(27573): mTo.length5
06-22 15:17:28.417: V/builder(27573): setting up edittext02
06-22 15:17:28.427: V/builder(27573): setting up edittext03
06-22 15:17:28.427: V/builder(27573): setting up edittext04
06-22 15:17:28.517: V/builder(27573): cursor count2
06-22 15:17:28.517: V/builder(27573): mTo.length5
06-22 15:17:28.527: V/builder(27573): setting up edittext12
06-22 15:17:28.527: V/builder(27573): setting up edittext13
06-22 15:17:28.527: V/builder(27573): setting up edittext14

这是ListView所在的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="match_parent" android:orientation="vertical">

<TextView
    android:id="@+id/textView6"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/labels_background"
    android:text="@string/lb_item_type"
    android:textSize="@dimen/dm_maint_tv" />

<CheckBox
    android:id="@+id/mt_base"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/lb_base" />

<TextView
    android:id="@+id/textView10"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:background="@color/labels_background"
    android:text="@string/lb_build"
    android:textSize="@dimen/dm_maint_tv" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0dp" android:layout_weight="1" android:id="@+id/builder">

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

    <ImageView
        android:id="@+id/mt_additem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="3dp"
        android:layout_marginTop="3dp"
        android:scaleType="centerInside"
        android:src="@drawable/ic_input_add" android:layout_gravity="top|right"/>

</FrameLayout>

1 个答案:

答案 0 :(得分:5)

如果你看到每个项目调用两次序列newView / bindView,你可能正在使用ListView,其高度设置为wrap_content,这总是一个坏主意。你能证实你没有这样做吗?

此外,我不能肯定地说,但如果您的第一个列表项被调用两次,这可能是完全有效的行为。听起来Android必须测量第一个列表项(这需要系统一次调用bindView),然后填充列表项(也可以通过调用bindView。填充第一行(需要两次调用bindView),每个后续列表项的宽度都是已知的,并且每个项目只需要调用一次bindView。让我知道这是否有意义..

无论哪种方式,我希望这不是你担心的事情......对bindView的一次额外调用不会杀死你的应用。 :)