问题
I have extended SimpleCursorAdapter and am running into a weird issue with bindView, which appears to be called twice on the first row.
Only the first row appears to be duplicated. I have a feeling it has something to do with the way the cursor is positioned, but have looked through all the adapter classes and can't seem to locate where this occurs.
Here is my code for bindView, I have inserted some Logs to show what I'm seeing.
@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");
}
}
}
}
}
Here is my output with only one item in the cursor
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
Here it is with 2 items
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
Here's the xml where the ListView is located
<?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:
If you see the sequence newView
/bindView
called twice per item, you are probably using ListView with its height set to wrap_content, which is always a bad idea. Can you confirm that you are not doing this?
Also, I can't say for sure but this might be perfectly valid behavior, if your first list item is being called twice I mean. It sounds like Android must measure the first list item (which requires the system to call bindView
one time) and then populate the list item (also by calling bindView
. After the first row is populated (which requires two calls to bindView
), the width of each subsequent list item is known and requires only one call to bindView
per each item. Let me know if that makes sense...
Either way, I hope this isn't something you are worried about... one additional call to bindView
won't kill your app. :)
来源:https://stackoverflow.com/questions/11162758/why-is-android-simplecursoradapter-bindview-duplicating-the-first-row