#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 и передать его конструктору 😉