2017-04-09 51 views
0

空ListView的原因是什麼?實際上,我用日期填充了數據庫,但ListView是空的,尤其是活動是空的。當使用arrayAdapter創建ListView時,該活動爲空,但當使用遊標Adapter創建應用程序時,該應用程序會崩潰。我看不到ListView

我寫了一個應用程序,它使用ListView列出我的SQLite日期的一部分。
但我看不到ListView。該應用程序無錯誤地開始,但活動是空的。我看不到我的錯誤。我希望別人能看到錯誤。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="match_parent" 
android:paddingLeft="16dp" 
android:paddingRight="16dp" 
android:paddingTop="16dp" 
android:paddingBottom="16dp" 
tools:context="com.example.katjarummler.hundeschule_petra_bennemann. 
GruppeAuslesenActivity" 
android:focusableInTouchMode="true" 
android:weightSum="1"> 

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:visibility="visible" 
    /> 

</LinearLayout> 

public class GruppeAuslesenActivity extends AppCompatActivity { 


public static final String LOG_TAG = 
GruppeAuslesenActivity.class.getSimpleName(); 
ListView mKundenListView; 
private HundeschuleMemoDataSource dataSource = new 
HundeschuleMemoDataSource(this); 

private GoogleApiClient client; 


protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gruppeauslesen); 

    initializeHundeschuleKundenListView(); 

    HundeschuleMemoDataSource dataSource = new 
    HundeschuleMemoDataSource(this); 


    client = new 
GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 

} 

private void initializeHundeschuleKundenListView() { 
    List<HundeschuleMemoKunden> listForInitialization = new 
ArrayList<HundeschuleMemoKunden>(); 

    mKundenListView = (ListView) findViewById(R.id.list); 

    // Erstellen des ArrayAdapters für unseren ListView 
    ArrayAdapter<HundeschuleMemoKunden> 
hundeschuleMemoKundenArrayAdapter = new 
ArrayAdapter<HundeschuleMemoKunden>(
      this, 
      android.R.layout.simple_list_item_multiple_choice, 
      listForInitialization) { 

     // Wird immer dann aufgerufen, wenn der übergeordnete ListView 
die Zeile neu zeichnen muss 

     @NonNull 
     public View getView(int position, View convertView, @NonNull 
ViewGroup parent) { 

      View view = super.getView(position, convertView, parent); 
      TextView textView = (TextView) view; 

      HundeschuleMemoKunden memo = (HundeschuleMemoKunden) 
mKundenListView.getItemAtPosition(position); 


      // Hier prüfen, ob Eintrag abgehakt ist. Falls ja, Text 
durchstreichen 
      if (memo.isChecked()) { 
       textView.setPaintFlags(textView.getPaintFlags() | 
Paint.STRIKE_THRU_TEXT_FLAG); 
       textView.setTextColor(Color.rgb(175, 175, 175)); 
      } else { 
       textView.setPaintFlags(textView.getPaintFlags() & 
(~Paint.STRIKE_THRU_TEXT_FLAG)); 
       textView.setTextColor(Color.DKGRAY); 
      } 


      return view; 
     } 
    }; 

    mKundenListView.setAdapter(hundeschuleMemoKundenArrayAdapter); 

    mKundenListView.setOnItemClickListener(new 
AdapterView.OnItemClickListener() { 

     public void onItemClick(AdapterView<?> adapterView, View view, 
int position, long id) { 
      HundeschuleMemoKunden memo = (HundeschuleMemoKunden) 
mKundenListView.getItemAtPosition(position); 


      // Hier den checked-Wert des Memo-Objekts umkehren, bspw. 
von true auf false 
      // Dann ListView neu zeichnen mit showAllListEntries() 
      HundeschuleMemoKunden updatedHundeschuleMemoKunden = 
dataSource.updateHundeschuleMemoKunden(memo.getId(), memo.getgName(), 
memo.getkName(), 
        memo.getkTelefon(), memo.gethName(), 
memo.getbeginn(), (!memo.isChecked())); 
      Log.d(LOG_TAG, "Checked-Status von Eintrag: " + 
updatedHundeschuleMemoKunden.toString() + " ist: " + 
updatedHundeschuleMemoKunden.isChecked()); 

      showAllListEntries(); 
     } 
    }); 



} 


private void showAllListEntries() { 

    List<HundeschuleMemoKunden> hundeschuleMemoGruppenList = 
dataSource.getAllGruppen(); 


    ArrayAdapter<HundeschuleMemoKunden> adapter = 
(ArrayAdapter<HundeschuleMemoKunden>) mKundenListView.getAdapter(); 

    adapter.clear(); 
    adapter.addAll(hundeschuleMemoGruppenList); 
    adapter.notifyDataSetChanged(); 
} 


protected void onResume() { 
    super.onResume(); 

    Log.d(LOG_TAG, "Die Datenquelle wird geöffnet."); 
    dataSource.open(); 

    Log.d(LOG_TAG, "Folgende Einträge sind in der Datenbank 
    enthalten:"); 
    showAllListEntries(); 
    } 

protected void onPause() { 
    super.onPause(); 

    Log.d(LOG_TAG, "Die Datenquelle wird geschlossen."); 
    dataSource.close(); 
} 


public Action getIndexApiAction() { 
    Thing object = new Thing.Builder() 
      .setName("GruppeAuslesen Page") // TODO: Define a title for 
the content shown. 
      // TODO: Make sure this auto-generated URL is correct. 
      .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) 
      .build(); 
    return new Action.Builder(Action.TYPE_VIEW) 
      .setObject(object) 
      .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
      .build(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    client.connect(); 
    AppIndex.AppIndexApi.start(client, getIndexApiAction()); 
} 

@Override 
public void onStop() { 
    super.onStop(); 


    AppIndex.AppIndexApi.end(client, getIndexApiAction()); 
    client.disconnect(); 
} 
} 

public class HundeschuleMemoDataSource { 

private static final String LOG_TAG = 
HundeschuleMemoDataSource.class.getSimpleName(); 

private SQLiteDatabase database; 
private HundeschuleMemoDBHelper dbHelper; 

private String[] columns = { 

     HundeschuleMemoDBHelper.COLUMN_ID, 
     HundeschuleMemoDBHelper.COLUMN_KName, 
     HundeschuleMemoDBHelper.COLUMN_GNAME, 
     HundeschuleMemoDBHelper.COLUMN_KTELEFON, 
     HundeschuleMemoDBHelper.COLUMN_HUND, 
     HundeschuleMemoDBHelper.COLUMN_BEGINN, 
     HundeschuleMemoDBHelper.COLUMN_CHECKED, 
}; 


public HundeschuleMemoDataSource(Context context) { 
    Log.d(LOG_TAG, "Unsere DataSource erzeugt jetzt den dbHelper. "); 
    dbHelper = new HundeschuleMemoDBHelper(context, "gruppe", 
TABLE_KUNDEN_LIST); 
} 


public void open() { 
    Log.d(LOG_TAG, "Eine Referenz auf die Datenbank wird jetzt 
angefragt."); 
    database = dbHelper.getWritableDatabase(); 
    Log.d(LOG_TAG, "Datenbankreferenz erhalten. Pfad zur Datenbank: " + 
database.getPath()); 
} 

public void close() { 
    dbHelper.close(); 
    Log.d(LOG_TAG, "Datenbank mit Hilfe des DBHelpers geschlossen."); 
} 


public HundeschuleMemoKunden createHundeschuleMemoKunden(String kName, 
String gName, String kTelefon, String hName, 
                 String beginn) 
{ 
    ContentValues values = new ContentValues(); 
    values.put(COLUMN_KName, kName); 
    values.put(COLUMN_GNAME, gName); 
    values.put(HundeschuleMemoDBHelper.COLUMN_KTELEFON, kTelefon); 
    values.put(COLUMN_HUND, hName); 
    values.put(HundeschuleMemoDBHelper.COLUMN_BEGINN, beginn); 

    long insertId = database.insert(TABLE_KUNDEN_LIST, null, values); 

    Cursor cursor = database.query(TABLE_KUNDEN_LIST, 
      columns, HundeschuleMemoDBHelper.COLUMN_ID + "=" + 
    insertId, 
      null, null, null, null); 

    cursor.moveToFirst(); 
    HundeschuleMemoKunden hundeschuleMemoKunden = 
    cursorToHundeschuleMemoKunden(cursor); 
    cursor.close(); 

    return hundeschuleMemoKunden; 
} 

public HundeschuleMemoKunden createHundeschuleMemoGruppen(String gName, 
String kName, String hName) { 
    ContentValues values = new ContentValues(); 
    values.put(COLUMN_GNAME, gName); 
    values.put(COLUMN_KName, kName); 
    values.put(COLUMN_HUND, hName); 


    long insertId = database.insert(TABLE_KUNDEN_LIST, null, values); 

    Cursor cursor = database.query(TABLE_KUNDEN_LIST, 
      columns, HundeschuleMemoDBHelper.COLUMN_ID + "=" + 
insertId, 
      null, null, null, null); 

    cursor.moveToFirst(); 
    HundeschuleMemoKunden hundeschuleMemoGruppen = 
    cursorToHundeschuleMemoKunden(cursor); 
    cursor.close(); 

    return hundeschuleMemoGruppen; 
} 


public void deleteHundeschuleMemoKunden(HundeschuleMemoKunden 
hundeschuleMemoKunden) { 
    long id = hundeschuleMemoKunden.getId(); 

    database.delete(TABLE_KUNDEN_LIST, 
      HundeschuleMemoDBHelper.COLUMN_ID + "=" + id, 
      null); 

    Log.d(LOG_TAG, "Eintrag gelöscht! ID: " + id + " Inhalt: " + 
hundeschuleMemoKunden.toString()); 
} 




public HundeschuleMemoKunden updateHundeschuleMemoKunden(long id, 
    String newkName, String newgName, String newkTelefon, String newHund, 
                 String 
    newBeginn, boolean newChecked) { 
    int intValueChecked = (newChecked) ? 1 : 0; 
    ContentValues values = new ContentValues(); 
    values.put(COLUMN_KName, newkName); 
    values.put(COLUMN_GNAME, newgName); 
    values.put(HundeschuleMemoDBHelper.COLUMN_KTELEFON, newkTelefon); 
    values.put(COLUMN_HUND, newHund); 
    values.put(HundeschuleMemoDBHelper.COLUMN_BEGINN, newBeginn); 
    values.put(HundeschuleMemoDBHelper.COLUMN_CHECKED, 
    intValueChecked); 

    database.update(TABLE_KUNDEN_LIST, 
      values, 
      HundeschuleMemoDBHelper.COLUMN_ID + "=" + id, 
      null); 

    Cursor cursor = database.query(TABLE_KUNDEN_LIST, 
      columns, HundeschuleMemoDBHelper.COLUMN_ID + "=" + id, 
      null, null, null, null); 

    cursor.moveToFirst(); 
    HundeschuleMemoKunden hundeschuleMemoKunden = 
    cursorToHundeschuleMemoKunden(cursor); 
    cursor.close(); 

    return hundeschuleMemoKunden; 
    } 


    private HundeschuleMemoKunden cursorToHundeschuleMemoKunden(Cursor 
    cursor) { 

    int idIndex = 
    cursor.getColumnIndex(HundeschuleMemoDBHelper.COLUMN_ID); 
    int idKName = cursor.getColumnIndex(COLUMN_KName); 
    int idGName = cursor.getColumnIndex(COLUMN_GNAME); 
    int idKTelefon = 
cursor.getColumnIndex(HundeschuleMemoDBHelper.COLUMN_KTELEFON); 
    int idHund = cursor.getColumnIndex(COLUMN_HUND); 
    int idBeginn = 
cursor.getColumnIndex(HundeschuleMemoDBHelper.COLUMN_BEGINN); 
    int idChecked = 
cursor.getColumnIndex(HundeschuleMemoDBHelper.COLUMN_CHECKED); 


    String kName = cursor.getString(idKName); 
    String gName = cursor.getString(idGName); 
    String kTelefon = cursor.getString(idKTelefon); 
    String Hund = cursor.getString(idHund); 
    String beginn = cursor.getString(idBeginn); 
    long id = cursor.getLong(idIndex); 
    int intValueChecked = cursor.getInt(idChecked); 

    boolean isChecked = (intValueChecked != 0); 


    HundeschuleMemoKunden hundeschuleMemoKunden = new 
    HundeschuleMemoKunden(kName, gName, kTelefon, Hund, 
      beginn); 

    return hundeschuleMemoKunden; 

} 



public List<HundeschuleMemoKunden> getAllHundeschuleMemos() { 
    List<HundeschuleMemoKunden> hundeschuleMemoKundenList = new 
ArrayList<>(); 

    Cursor cursor = database.query(TABLE_KUNDEN_LIST, 
      columns, null, null, null, null, null); 

    cursor.moveToFirst(); 


    HundeschuleMemoKunden hundeschuleMemoKunden; 

    while (!cursor.isAfterLast()) { 
     hundeschuleMemoKunden = cursorToHundeschuleMemoKunden(cursor); 
     hundeschuleMemoKundenList.add(hundeschuleMemoKunden); 
     Log.d(LOG_TAG, "ID: " + hundeschuleMemoKunden.getId() + ", 
    Inhalt: " + hundeschuleMemoKunden.toString()); 
     cursor.moveToNext(); 
    } 

    cursor.close(); 

    return hundeschuleMemoKundenList; 
    } 

public List<HundeschuleMemoKunden> getAllGruppen() { 
    List<HundeschuleMemoKunden> gruppenList = new ArrayList<>(); 
    SQLiteDatabase database = dbHelper.getWritableDatabase(); 


    String selectQuery = "SELECT " + 
      HundeschuleMemoDBHelper.COLUMN_ID + " , " + 
      HundeschuleMemoDBHelper.COLUMN_GNAME + " , " + 
      HundeschuleMemoDBHelper.COLUMN_KName + " , " + 
      HundeschuleMemoDBHelper.COLUMN_HUND + " , " + 
      HundeschuleMemoDBHelper.COLUMN_CHECKED + 
      " FROM " + HundeschuleMemoDBHelper.TABLE_KUNDEN_LIST + " 
    ORDER BY 2 ASC "; 


    Cursor cursor = database.rawQuery(selectQuery, null); 


    cursor.moveToFirst(); 
    cursor.close(); 
    database.close(); 
    return gruppenList; 
    } 

    } 

public class HundeschuleMemoDBHelper extends SQLiteOpenHelper { 


private static final String LOG_TAG = 
HundeschuleMemoDBHelper.class.getSimpleName(); 



public static final String DB_NAME = "Kunden_list.db"; 
public static final int DB_VERSION = 7; 

public static final String TABLE_KUNDEN_LIST = "Kunden_list"; 


public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_KName = "Name"; 
public static final String COLUMN_GNAME = "Gruppe"; 
public static final String COLUMN_KTELEFON = "Telefon"; 
public static final String COLUMN_HUND = "Hund"; 
public static final String COLUMN_BEGINN = "Beginn"; 
public static final String COLUMN_CHECKED = "checked"; 



public static final String SQL_CREATE = "CREATE TABLE " + 
TABLE_KUNDEN_LIST + 
     "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     COLUMN_KName + " TEXT NOT NULL, " + 
     COLUMN_GNAME + " TEXT NOT NULL, " + 
     COLUMN_KTELEFON + " TEXT NOT NULL, " + 
     COLUMN_HUND + " TEXT NOT NULL, " + 
     COLUMN_BEGINN + " TEXT NOT NULL, " + 
     COLUMN_CHECKED + " BOOLEAN NOT NULL DEFAULT 0);"; 


public static final String SQL_DROP = "DROP TABLE IF EXISTS " + 
TABLE_KUNDEN_LIST; 



public HundeschuleMemoDBHelper(Context context, String gruppe, String 
sql) { 
    super(context, DB_NAME, null, DB_VERSION); 
    Log.d(LOG_TAG, "DBHelper hat die Datenbank: " + getDatabaseName() + 
" erzeugt."); 
} 



//Die onCreate-Methode wird nur aufgerufen, falls die Datenbank noch 
nicht existiert 
public void onCreate(SQLiteDatabase db) { 
    try{ 
     Log.d(LOG_TAG, "Die Tabelle wird mit SQL-Befehl: " + SQL_CREATE 
+ " angelegt."); 
     db.execSQL(SQL_CREATE); 


    } 
    catch(Exception ex){ 
     Log.e(LOG_TAG, "Fehler beim Anlegen der Tabelle: " + 
ex.getMessage()); 
    } 

} 


// Die onUpgrade-Methode wird aufgerufen, sobald die neue 
Versionsnummer höher 
// als die alte Versionsnummer ist und somit ein Upgrade notwendig wird 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int 
newVersion) { 
    Log.d(LOG_TAG, "Die Tabelle mit Versionsnummer " + oldVersion + " 
wird entfernt."); 
    db.execSQL(SQL_DROP); 


    onCreate(db); 
    } 

} 

public class HundeschuleMemoKunden { 

private String kName; 
private String gName; 
private String kTelefon; 
private String hName; 
private String beginn; 
private long id; 
private boolean checked; 


public HundeschuleMemoKunden(String kName, String gName, String 
kTelefon, String hName, 
          String beginn){ 
    this.id=id; 
    this.kName=kName; 
    this.gName=gName; 
    this.kTelefon=kTelefon; 
    this.hName=hName; 
    this.beginn=beginn; 
    this.checked = checked; 
} 



public String getkName(){ 
    return kName; 
} 
public void setkName(String kName){ 
    this.kName = kName; 
} 
public String getgName(){return gName;} 
public void setgName(String gName){ 
    this.gName = gName; 
} 
public String getkTelefon(){ 
    return kTelefon; 
} 
public void setkTelefon(String kTelefon){this.kTelefon = kTelefon;} 
public String gethName(){ 
    return hName; 
} 
public void sethName(String hName){ 
    this.hName = hName; 
} 
public String getbeginn(){ 
    return beginn; 
} 
public void setbeginn(String beginn){ 
    this.beginn = beginn; 
} 
public long getId(){return id;} 
public void setId(long id){ 
    this.id = id; 
} 
public boolean isChecked(){return checked;} 
public void setChecked(boolean checked){this.checked = checked;} 





    public String toString(){ 
    String output = kName + " " + gName + " " + kTelefon + " " + hName 
+ " " + beginn; 
    return output; 
    } 



} 

回答

0
android:layout_height="wrap_content" 

你需要匹配父

如果你正在使用一個數據庫,嘗試使用CursorAdapter的,而不是ArrayAdapter並確保dataSource.getAllGruppen()實際返回的東西

而且,你有HundeschuleMemoDataSource dataSource兩個實例。從現場移除聲明,因爲上下文尚未初始化

private HundeschuleMemoDataSource dataSource; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gruppeauslesen); 

    dataSource = new HundeschuleMemoDataSource(this); 

    initializeHundeschuleKundenListView(); 

如果你沒有使用一個CursorAdapter,這裏是你的糾正方法

public Cursor getAllGruppen() { 

    String selectQuery = "SELECT " + 
     HundeschuleMemoDBHelper.COLUMN_ID + " , " + 
     HundeschuleMemoDBHelper.COLUMN_GNAME + " , " + 
     HundeschuleMemoDBHelper.COLUMN_KName + " , " + 
     HundeschuleMemoDBHelper.COLUMN_HUND + " , " + 
     HundeschuleMemoDBHelper.COLUMN_CHECKED + 
     " FROM " + HundeschuleMemoDBHelper.TABLE_KUNDEN_LIST + 
     " ORDER BY 2 ASC "; 

    return dbHelper.getReadableDatabase().rawQuery(selectQuery, null); 
} 
+0

你可以與你做什麼的截圖更新你的問題看到?還有一個記錄'dataSource.getAllGruppen()'大小的Log語句? –