我已经扩展了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>
答案 0 :(得分:5)
如果你看到每个项目调用两次序列newView
/ bindView
,你可能正在使用ListView,其高度设置为wrap_content,这总是一个坏主意。你能证实你没有这样做吗?
此外,我不能肯定地说,但如果您的第一个列表项被调用两次,这可能是完全有效的行为。听起来Android必须测量第一个列表项(这需要系统一次调用bindView
),然后填充列表项(也可以通过调用bindView
。填充第一行(需要两次调用bindView
),每个后续列表项的宽度都是已知的,并且每个项目只需要调用一次bindView
。让我知道这是否有意义..
无论哪种方式,我希望这不是你担心的事情......对bindView
的一次额外调用不会杀死你的应用。 :)