2012-04-10 23 views
1

Ich entwickle und Android App auf 4.0.3 und habe mehrere ListActivities mit ihren eigenen CursorAdapters. Wenn ich nur einen angepassten CursorAdapter verwende, funktioniert alles gut, aber wenn ich mehr benutze, stürzt meine Anwendung ab.Verwendung mehrerer angepasster CursorAdapter

Fehler-Stack:

04-10 15:41:08.897: W/dalvikvm(2239): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
    04-10 15:41:08.956: E/AndroidRuntime(2239): FATAL EXCEPTION: main 
    04-10 15:41:08.956: E/AndroidRuntime(2239): java.lang.NullPointerException 
    04-10 15:41:08.956: E/AndroidRuntime(2239):  at com.tsystems.openconf.database.adapter.ConferenceListCursorAdapter.bindView(ConferenceListCursorAdapter.java:38) 
    04-10 15:41:08.956: E/AndroidRuntime(2239):  at android.widget.CursorAdapter.getView(CursorAdapter.java:250) 
    ... 

Es scheint, dass Android nicht mehrere ListActivities verarbeiten kann.

Alle meine ererbten ListActivity Klassen den folgenden Code, mit Ausnahme der Cursor Klasse:

public void onCreate(Bundle savedInstanceState) { 
     Log.d(TAG, "onCreate called"); 
     super.onCreate(savedInstanceState); 

     Log.d(TAG, "create DatabaseOpenHelper"); 
     DatabaseOpenHandler helper = new DatabaseOpenHandler(this); 

     Log.d(TAG, "get writeable database access"); 
     database = helper.getWritableDatabase(); 

     Log.d(TAG, "create Cursor for database access"); 
     data = database.query(DatabaseConstants.TABLE_CONFERENCES, fields, 
       null, null, null, null, null); 

     Log.d(TAG, "set ConferenceListCursorAdapter"); 
     setListAdapter(new ConferenceListCursorAdapter(this, data)); 
    } 

Meine maßgeschneiderte geerbt Cursor sieht wie folgt aus und überschreibt die Bindview und NewView Methode:

public class ConferenceListCursorAdapter extends CursorAdapter { 

    // logging identifier 
    private static final String TAG = ConferenceListCursorAdapter.class.getSimpleName(); 

    private Cursor cursor; 

    private Context context; 

    private final LayoutInflater inflater; 

    public ConferenceListCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, true); 
     this.inflater = LayoutInflater.from(context); 
     this.context = context; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     Log.d(TAG, "bindView of ConferenceListAdapter called"); 

     TextView test = (TextView) view.findViewById(R.id.conference_list_id); 

     test.setText(Long.toString(cursor.getLong(cursor.getColumnIndex(DatabaseConstants.CONFERENCES_STARTTIMEINMILLIS)))); 

    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     return inflater.inflate(R.layout.conference_list_item, parent, false); 
    } 
} 

EDIT

In Zeile 38 steht geschrieben:

Es sieht so aus, als ob Android die TextView nicht finden kann und deshalb die NPE beim Einstellen des Textes wirft. Die ID des Tests TextView ist in der R-Klasse geschrieben und sollte von Android gefunden werden. Warum wirft es die NPE?

Code-Schnipsel meines Layout XML-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/conference_list_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" /> 

</RelativeLayout> 
+0

Was ist in Zeile 38 von ConferenceListCurosrAdapter? Ich sehe nur 32 Zeilen in dem, was Sie gepostet haben ... – Barak

+1

Tritt dies nur auf, wenn die Aktivität neu gestartet wird? ESP-Debugging sagt mir, dass "test" wahrscheinlich null ist. – Qberticus

+0

+1 für die Verwendung von ESP – Barak

Antwort

0

Ich habe das Problem mit ArrayAdapter anstelle von CursorAdapter behoben. Ich musste mich sehr ändern, aber jetzt funktioniert alles gut.

0

Eine Vermutung, dass Sie einen Code aus links, was Sie geschrieben und die Zeile 38 tatsächlich

test.setText(Long.toString(cursor.getLong(cursor.getColumnIndex(DatabaseConstants.CONFERENCES_STARTTIMEINMILLIS)))); 

sein könnte ich glaube, Sie brauchen zu verwenden cursor.moveToFirst(); bevor Sie versuchen, etwas mit Ihrem Cursor zu tun. Wenn ein Cursor erstellt wird, wird er vor der erste Datensatz positioniert. Wenn Sie versuchen, es in diesem Zustand zu verwenden, erhalten Sie eine NPE.

+0

Wenn der Cursor an bindView übergeben wird, ist er bereits an der richtigen Position gesetzt. Daher sollte seine Position in Ordnung sein, und sie sollte nicht null sein, da die Basisklasse die Arbeit gemacht hat, sie in diese Position zu bringen. – Qberticus

+0

Argh. Ich sehe das moveToFirst-Thema unter anderen Umständen so oft, dass ich zu dieser Schlussfolgerung springen konnte, ohne näher genug zu schauen. Danke, dass du es aufgezeigt hast. Würde die Leute nicht verwirren. Nun, wenn das OP nur angeben würde, welche Zeile 38 tatsächlich ist ... – Barak

+0

Zeile 38: test.setText (Long.toString (cursor.getLong (cursor.getColumnIndex (DatabaseConstants.CONFERENCES_STARTTIMEINMILLIS)))); –

Verwandte Themen