SimpleCursorAdapterから拡張されたカスタムListCursorAdapterがあります。リストの行には、2つのTextFieldと1つのCheckBoxがあります。Android:SimpleCursorAdapter.bindViewがfindViewByIdにnullを配信することがあります
スクロールすると、チェックボックスの動作が変わってしまいます。選択されたものは行間から別のものへと「ホップ」する。 3番目の行に選択されたチェックボックスがあり、高速にスクロールしている場合、突然別の行が選択されます。
私は時々、私のbindView-方法でfindViewByIdがnullを返すことが判明:
@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メソッドが頻繁に呼び出されるのは正しいですか?行ごとに1回だけ呼び出されるべきではありませんか?
ありがとうございます!
更新: 二つの異なるスタックトレースがあります。返されたチェックボックスがnullでない場合には(それが働いているとき=) は、スタックトレースに以下の通りです:
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]
そして返されたオブジェクトがnullの場合、 StackTraceは以下の通りです:
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]
... list..elseスクロールの行で定義されたテキスト/イメージは、いくつかのエラーを表示することができますかどうか、あなたのすべてのビューをインスタンス化はい、bindViewも一度行当たり呼ばれるが、する必要がありますリストをスクロールします。 –