Запрос базы данных к ListActivity

#android #listview #listactivity

#Android #просмотр списка #listactivity

Вопрос:

Я не уверен, что делаю это правильно, с моими ограниченными знаниями этого языка программирования… или любой, если на то пошло. Давайте посмотрим, смогу ли я придать этому смысл, чтобы я мог получить некоторую помощь.

Я запускаю запрос к своей базе данных, чтобы извлечь все записи в базе данных

Часть DBAdapter.java:

 //***RETRIEVES ALL THE FINALSCORES***//
public Cursor getAllFinalscores()
{
    return db.query(DATABASE_TABLE, new String[] {
            KEY_ROWID,
            KEY_DATE,
            KEY_FINALSCORE,
            KEY_HOLESPLAYED},
            null, null, null, null, null);
}
  

Затем я создал отдельный класс, который расширяет ListActivity (потому что я хочу, чтобы все содержимое отображалось в listview.

PastGames.java

 import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class PastGames extends ListActivity {

@Override

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pastgames);



    DBAdapter db = new DBAdapter(this);

    db.open();
    Cursor c = db.getAllFinalscores();
    if (c.moveToFirst())
    {
        do {
            String[] listData = new String [] {c.getString(1),
                    c.getString(2), c.getString(3)};
            this.setListAdapter(new ArrayAdapter<String>(this,
                    R.layout.pastgames, listData));
        }
        while (c.moveToNext());
    }
    db.close();


}
  

}

и затем я вызываю это из своей основной деятельности (которая, просто к сведению, не расширяет ListActivity

     @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
case R.id.past_games:
            Intent intentListGames = new Intent().setClass( this, PastGames.class );
            this.startActivityForResult( intentListGames, 0 );
            return true;
   }
        return true;
    }
  

Итак, если я правильно понимаю, я вызываю PastGames.java из моей основной деятельности (которая затем запускается PastGames.java ) и в прошлых играх.java — onCreate Я открываю базу данных, запускаю свой запрос, закрываю и, надеюсь, помещаю в listview

Я получаю следующее в LogCat, когда запускаю эту опцию в эмуляторе:

 06-13 22:10:36.581: ERROR/AndroidRuntime(204): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.deckert/com.deckert.PastGames}: java.lang.ClassCastException: android.widget.TextView
06-13 22:10:36.581: ERROR/AndroidRuntime(204):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
06-13 22:10:36.581: ERROR/AndroidRuntime(204):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
06-13 22:10:36.581: ERROR/AndroidRuntime(204):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
  

Может кто-нибудь, пожалуйста, помочь мне понять, почему это не работает?

Заранее благодарю вас и приношу извинения за огромный пост!

Ответ №1:

Вы используете один и тот же макет как в вашем корневом представлении ArrayAdapter , так и в ваших прошлых играх Activity . Я полагаю, что вы не хотите использовать макет ListView для своего макета Activities. Я думаю, что это то, что вызывает ClassCastException , потому что ваш ListView макет, вероятно, определен так, чтобы использовать только простой TextView , и активность взрывается, говоря, что она не может привести ListView к TextView .

Комментарии:

1. Итак, я удалил setContentView при создании, и мой XML-файл представляет собой TextView в линейной компоновке. Теперь я получаю, что ArrayAdapter требует, чтобы идентификатор ресурса был TextView, что я должен изменить для этого?

2. ПОНЯЛ! Мне нужно было удалить линейный макет из xml и сделать его ТОЛЬКО textview!

Ответ №2:

Вы неправильно создаете адаптер для передачи в ListView. Если вы посмотрите на конструктор адаптера, ожидает TextView. И не имеет смысла, что у вас есть один и тот же ресурс для основного макета и этого TextView. Я думаю, вам нужно создать Textview и передать его конструктору 😉