2012-06-22 3 views
0

Я расширил SimpleCursorAdapter и запутался в странную проблему с bindView, которая, как представляется, дважды вызывается в первой строке.Почему андроид SimpleCursorAdapter bindView дублирует первую строку?

Только первая строка дублируется. У меня есть ощущение, что это связано с тем, как позиционируется курсор, но просмотрел все классы адаптера и не может найти, где это происходит.

Вот мой код для bindView, я вставил несколько журналов, чтобы показать, что я вижу.

Вот мой выход только один элемент в курсоре

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 

Вот XML, где расположен ListView

<?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> 

+0

WTF это должно означать – connoisseur

+0

Это означает, что мне понравилось повествование. (т. е. нет никаких доказательств вопроса ... и вы никогда не подразумеваете, что есть проблема). –

+0

и я QUOTE «Я запутался в странную проблему с bindView, которая, как представляется, дважды вызывается в первой строке». – connoisseur

ответ

5

Если вы видите последовательность newView/bindView, вызываемую дважды за элемент, вы, вероятно, используете ListView с его высотой, установленной в wrap_content, что всегда является плохой идеей. Можете ли вы подтвердить, что вы этого не делаете?

Кроме того, я не могу сказать точно, но это может быть совершенно допустимое поведение, если ваш первый элемент списка называется дважды. Похоже, что Android должен измерять первый элемент списка (для чего требуется, чтобы система вызывала bindView один раз) и , затем заполнить элемент списка (также путем вызова bindView.После заполнения первой строки (что требует двух вызовов bindView) ширина каждого последующего элемента списка известна и требует только одного вызова bindView за каждый элемент. Сообщите мне, если это имеет смысл ...

В любом случае, я надеюсь, что это не то, о чем вы беспокоитесь. один дополнительный вызов bindView не убьет ваше приложение. :)

+0

Хорошо, только для вас, я обновил название, а также добавил макет xml. ListView настроен на совпадение в обоих направлениях. Он также не дублирует все строки, только первый. – connoisseur

+0

Это имеет смысл, но это также ломает мое приложение. Каждый элемент ListView имеет 3 EditTexts, и я надеялся использовать TextWatcher на любом из трех, чтобы обнаружить изменение и позволить пользователю сохранить строку. Поскольку bindView вызывается дважды в первом элементе, Textwatcher запускает и действует так, как если бы данные всегда менялись – connoisseur

Смежные вопросы