2012-06-22 1 views
0

SimpleCursorAdapter를 확장했으며 bindView에서 이상한 문제가 발생했습니다. bindView는 첫 번째 행에서 두 번 호출되는 것처럼 보입니다.android SimpleCursorAdapter bindView가 첫 번째 행을 복제하는 이유는 무엇입니까?

첫 번째 행만 복제 된 것처럼 보입니다. 커서가 위치한 방식과 관련이 있지만 모든 어댑터 클래스를 살펴본 결과이 위치를 찾을 수없는 느낌이 들었습니다.

다음은 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: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이있어 함께

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 

다음 커서에서 하나의 항목 만 내 출력

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

및 I QUOTE "bindView에서 이상한 문제가 발생합니다. 첫 번째 행에서 두 번 호출되는 것으로 보입니다." – connoisseur

답변

5

시퀀스 당 newView/bindView이 표시되는 경우 ListView를 사용하여 높이를 wrap_content로 설정했을 가능성이 있습니다. 이는 항상 나쁜 생각입니다. 당신이 이것을하지 않는다는 것을 확인할 수 있습니까?

또한 확실히 말할 수는 없지만 첫 번째 목록 항목이 두 번 호출되는 경우 이것이 완벽하게 유효한 동작 일 수 있습니다. 안드로이드가 첫 번째 목록 항목 (시스템에서를 한 번 호출해야 함)을 측정해야하고 다음이 목록 항목을 채우고 (첫 번째 행이 채워진 후 (bindView으로 두 번 필요) 목록 항목을 채우는 것처럼 들리는 것 같습니다. 각 후속 항목의 너비가 알려지고 각 항목 당 bindView 번으로 한 번만 전화하면됩니다. 그 말이 맞는지 알려주세요 ...

어느 쪽이든, 나는 이것이 당신이 걱정하지 않는 것이되기를 바랍니다. bindView에 한 번 더 전화하면 앱이 종료되지 않습니다. :)

+0

자, 이제 레이아웃 xml을 추가 할뿐 아니라 제목도 업데이트했습니다. ListView는 두 가지 방법으로 모두 대치되도록 설정됩니다. 또한 모든 행을 복제하는 것이 아니라 처음 행을 복제하는 것입니다. – connoisseur

+0

그것도 의미가 있지만, 또한 내 애플 리케이션을 깰. 각 ListView 항목은 3 EditTexts하고 3 TextWatcher를 사용하여 변화를 감지하고 사용자가 행을 저장할 수 있도록 기대했다. bindView는 첫 번째 항목에서 두 번 호출되므로 Textwatcher는 데이터가 항상 변경된 것처럼 트리거하고 작동합니다 – connoisseur