Android:SimpleCursorAdapter.bindView有时为findViewById提供空值
我有一个从SimpleCursorAdapter扩展而来的自定义ListCursorAdapter。在列表的行中,有两个文本字段和一个复选框 快速滚动时,复选框的行为很奇怪;选定的行从一行“跳”到另一行,例如,如果第三行包含选定的复选框,并且我正在快速滚动,则会突然选择另一行 我发现有时候,我的bindView方法中的findViewById返回null:Android:SimpleCursorAdapter.bindView有时为findViewById提供空值,android,listview,Android,Listview,我有一个从SimpleCursorAdapter扩展而来的自定义ListCursorAdapter。在列表的行中,有两个文本字段和一个复选框 快速滚动时,复选框的行为很奇怪;选定的行从一行“跳”到另一行,例如,如果第三行包含选定的复选框,并且我正在快速滚动,则会突然选择另一行 我发现有时候,我的bindView方法中的findViewById返回null: @Override public final View newView(final Context context, final C
@Override
public final View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final LayoutInflater inflater = LayoutInflater.from(context);
final View v = inflater.inflate(mLayout, null);
return v;
}
@Override
public final void bindView(final View v, final Context context, final Cursor cursor) {
int haltestelleCol = cursor.getColumnIndex("haltestelle");
int nameCol = cursor.getColumnIndex("name");
int linieCol = cursor.getColumnIndex("linie");
int startseiteCol = cursor.getColumnIndex("startseite");
int idCol = cursor.getColumnIndex("_id");
final String haltestelleString = cursor.getString(haltestelleCol);
final String nameString = cursor.getString(nameCol);
// Next set the haltestelle of the entry.
final TextView haltestelle = (TextView) v.findViewById(R.id.favorite_haltestelle);
if (haltestelle != null) {
if (nameString != null && !nameString.equals("")) {
haltestelle.setText(nameString);
} else {
haltestelle.setText(haltestelleString);
}
}
// next set the linie
final TextView linie = (TextView) v.findViewById(R.id.favorite_linie);
if (linie != null) {
linie.setText(cursor.getString(linieCol));
}
// set startseite-flag or not
final int startseite = cursor.getInt(startseiteCol);
final CheckBox startseiteCheckbox = (CheckBox) v.findViewById(R.id.favorite_startseite);
final int id = cursor.getInt(idCol);
if (startseiteCheckbox != null) {
if (startseite > 0) {
startseiteCheckbox.setChecked(true);
}
checkboxes.add(startseiteCheckbox);
startseiteCheckbox.setId(id);
startseiteCheckbox.setOnClickListener(new StartseiteClickListener(cursor.getPosition()));
} else {
System.out.println();
}
}
i、 我在“System.out.println()”部分。有人能告诉我为什么我有这种行为吗?经常调用bindView方法对吗?它不应该每行只调用一次吗
非常感谢
更新:
有两种不同的堆栈跟踪:
如果返回的复选框不为空(=当它工作时),StackTrace如下所示:
Thread [<3> main] (Suspended (breakpoint at line 110 in FavoriteListCursorAdapter))
FavoriteListCursorAdapter.bindView(View, Context, Cursor) line: 110
FavoriteListCursorAdapter(CursorAdapter).getView(int, View, ViewGroup) line: 186
ListView(AbsListView).obtainView(int) line: 1274
ListView.makeAndAddView(int, int, boolean, int, boolean) line: 1668
ListView.fillUp(int, int) line: 667
ListView.fillGap(boolean) line: 613
ListView(AbsListView).trackMotionScroll(int, int) line: 2531
ListView(AbsListView).onTouchEvent(MotionEvent) line: 2001
ListView.onTouchEvent(MotionEvent) line: 3234
ListView(View).dispatchTouchEvent(MotionEvent) line: 3709
ListView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 852
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
ViewFlipper(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
FavoritenActivity(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
Scout(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
ViewRoot.handleMessage(Message) line: 1691
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4363
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 860
ZygoteInit.main(String[]) line: 618
NativeStart.main(String[]) line: not available [native method]
Thread [<3> main] (Suspended (breakpoint at line 123 in FavoriteListCursorAdapter))
FavoriteListCursorAdapter.bindView(View, Context, Cursor) line: 123
FavoriteListCursorAdapter(CursorAdapter).getView(int, View, ViewGroup) line: 186
ListView(AbsListView).obtainView(int) line: 1256
ListView.makeAndAddView(int, int, boolean, int, boolean) line: 1668
ListView.fillUp(int, int) line: 667
ListView.correctTooHigh(int) line: 1289
ListView.fillGap(boolean) line: 609
ListView(AbsListView).trackMotionScroll(int, int) line: 2531
ListView(AbsListView).onTouchEvent(MotionEvent) line: 2001
ListView.onTouchEvent(MotionEvent) line: 3234
ListView(View).dispatchTouchEvent(MotionEvent) line: 3709
ListView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 852
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
ViewFlipper(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
FavoritenActivity(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
Scout(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
ViewRoot.handleMessage(Message) line: 1691
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4363
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 860
ZygoteInit.main(String[]) line: 618
NativeStart.main(String[]) line: not available [native method]
Thread[main](挂起(FavoriteListCursorAdapter中第110行的断点))
FavoriteListCursorAdapter.bindView(视图、上下文、光标)行:110
FavoriteListCursorAdapter(CursorAdapter).getView(int,View,ViewGroup)行:186
列表视图(AbsListView)。获取视图(int)行:1274
makeAndAddView(int,int,boolean,int,boolean)行:1668
ListView.fillUp(int,int)行:667
ListView.fillGap(布尔)行:613
ListView(AbsListView)。轨迹运动滚动(int,int)行:2531
ListView(AbsListView).onTouchEvent(MotionEvent)行:2001
onTouchEvent(MotionEvent)行:3234
ListView(视图).dispatchTouchEvent(MotionEvent)行:3709
ListView(ViewGroup).dispatchTouchEvent(MotionEvent)行:852
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
ViewFlipper(ViewGroup).dispatchTouchEvent(MotionEvent)行:884
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
FrameLayout(视图组).dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView(视图组)。dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent)行:1659
PhoneWindow.superDispatchTouchEvent(MotionEvent)行:1107
FavoriteActivity(活动)。dispatchTouchEvent(MotionEvent)行:2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent)行:1643
FrameLayout(视图组).dispatchTouchEvent(MotionEvent)行:884
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent)行:884
FrameLayout(视图组).dispatchTouchEvent(MotionEvent)行:884
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView(视图组)。dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent)行:1659
PhoneWindow.superDispatchTouchEvent(MotionEvent)行:1107
侦察员(活动)。dispatchTouchEvent(MotionEvent)线路:2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent)行:1643
ViewRoot.handleMessage(消息)行:1691
ViewRoot(处理程序)。dispatchMessage(消息)行:99
Looper.loop()行:123
ActivityThread.main(字符串[])行:4363
invokenactive(Object,Object[],Class,Class[],Class,int,boolean)行:不可用[本机方法]
调用(对象,对象…)行:521
ZygoteInit$MethodAndArgsCaller.run()行:860
颧骨单位。主(字符串[])行:618
NativeStart.main(字符串[])行:不可用[本机方法]
当返回的对象为null时,StackTrace如下所示:
Thread [<3> main] (Suspended (breakpoint at line 110 in FavoriteListCursorAdapter))
FavoriteListCursorAdapter.bindView(View, Context, Cursor) line: 110
FavoriteListCursorAdapter(CursorAdapter).getView(int, View, ViewGroup) line: 186
ListView(AbsListView).obtainView(int) line: 1274
ListView.makeAndAddView(int, int, boolean, int, boolean) line: 1668
ListView.fillUp(int, int) line: 667
ListView.fillGap(boolean) line: 613
ListView(AbsListView).trackMotionScroll(int, int) line: 2531
ListView(AbsListView).onTouchEvent(MotionEvent) line: 2001
ListView.onTouchEvent(MotionEvent) line: 3234
ListView(View).dispatchTouchEvent(MotionEvent) line: 3709
ListView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 852
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
ViewFlipper(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
FavoritenActivity(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
Scout(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
ViewRoot.handleMessage(Message) line: 1691
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4363
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 860
ZygoteInit.main(String[]) line: 618
NativeStart.main(String[]) line: not available [native method]
Thread [<3> main] (Suspended (breakpoint at line 123 in FavoriteListCursorAdapter))
FavoriteListCursorAdapter.bindView(View, Context, Cursor) line: 123
FavoriteListCursorAdapter(CursorAdapter).getView(int, View, ViewGroup) line: 186
ListView(AbsListView).obtainView(int) line: 1256
ListView.makeAndAddView(int, int, boolean, int, boolean) line: 1668
ListView.fillUp(int, int) line: 667
ListView.correctTooHigh(int) line: 1289
ListView.fillGap(boolean) line: 609
ListView(AbsListView).trackMotionScroll(int, int) line: 2531
ListView(AbsListView).onTouchEvent(MotionEvent) line: 2001
ListView.onTouchEvent(MotionEvent) line: 3234
ListView(View).dispatchTouchEvent(MotionEvent) line: 3709
ListView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 852
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
ViewFlipper(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
FavoritenActivity(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1659
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1107
Scout(Activity).dispatchTouchEvent(MotionEvent) line: 2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1643
ViewRoot.handleMessage(Message) line: 1691
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4363
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 860
ZygoteInit.main(String[]) line: 618
NativeStart.main(String[]) line: not available [native method]
Thread[main](挂起(FavoriteListCursorAdapter中第123行的断点))
FavoriteListCursorAdapter.bindView(视图、上下文、光标)行:123
FavoriteListCursorAdapter(CursorAdapter).getView(int,View,ViewGroup)行:186
列表视图(AbsListView)。获取视图(int)行:1256
makeAndAddView(int,int,boolean,int,boolean)行:1668
ListView.fillUp(int,int)行:667
ListView.correctTooHigh(int)行:1289
ListView.fillGap(布尔)行:609
ListView(AbsListView)。轨迹运动滚动(int,int)行:2531
ListView(AbsListView).onTouchEvent(MotionEvent)行:2001
onTouchEvent(MotionEvent)行:3234
ListView(视图).dispatchTouchEvent(MotionEvent)行:3709
ListView(ViewGroup).dispatchTouchEvent(MotionEvent)行:852
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
ViewFlipper(ViewGroup).dispatchTouchEvent(MotionEvent)行:884
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
FrameLayout(视图组).dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView(视图组)。dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent)行:1659
PhoneWindow.superDispatchTouchEvent(MotionEvent)行:1107
FavoriteActivity(活动)。dispatchTouchEvent(MotionEvent)行:2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent)行:1643
FrameLayout(视图组).dispatchTouchEvent(MotionEvent)行:884
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent)行:884
FrameLayout(视图组).dispatchTouchEvent(MotionEvent)行:884
LinearLayout(视图组)。dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView(视图组)。dispatchTouchEvent(MotionEvent)行:884
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent)行:1659
PhoneWindow.superDispatchTouchEvent(MotionEvent)行:1107
侦察员(活动)。dispatchTouchEvent(MotionEvent)线路:2061
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent)行:1643
ViewRoot.handleMessage(消息)行:1691
ViewRoot(处理程序)。dispatchMessage(消息)行:99
Looper.loop()行:123
ActivityThread.main(字符串[])行:4363
invokenactive(Object,Object[],Class,Class[],Class,int,boolean)行:不可用[本机方法]
调用(对象,对象…)行:521
ZygoteInit$MethodAndArgsCaller.run()行:860
主合子体(