2010-11-21 4 views
1

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] 
+1

... list..elseスクロールの行で定義されたテキスト/イメージは、いくつかのエラーを表示することができますかどうか、あなたのすべてのビューをインスタンス化はい、bindViewも一度行当たり呼ばれるが、する必要がありますリストをスクロールします。 –

答えて

0

あなたはいくつかの奇妙な行動に気づくことができます - つまり、あなたが上にスクロールし、ドロップダウンリストとして名前がシフトし始める表示されますことを。 何が起こるかは、インスタンス化せずにTextViewに何かを配置していないと(基本的にプレースホルダーとして機能する)、bindViewメソッドでは何もTextViewsにバインドされず、したがってシフトされません。 基本的に、あなたのリスト内で物が動いているのを見たら、それはnewViewとbindViewメソッドの両方ですべてのビューに物事を束縛していることを確認する大きな旗です。

ので、

関連する問題