我正在尝试使用从数据库中选择所有查询来填充列表视图(1个主键和4个属性。我现在所拥有的不是抛出错误,但它没有生成任何可用的东西。下面是我正在使用的查询:
public List<SavedLocation> getAllLocationDescriptions() {
List<SavedLocation> locationList = new ArrayList<SavedLocation>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_LOCATIONS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
SavedLocation location = new SavedLocation();
location.setLocation(cursor.getString(0));
// Adding locationt to list
locationList.add(location);
} while (cursor.moveToNext());
}
return locationList;
}
这是我的列表视图活动。 (注意:日志输出正在写出正确的结果,因此似乎正在运行)
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class SavedLocationsListTest extends ListActivity{
@Override
public void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Intent intent = getIntent();
DatabaseHandler db = new DatabaseHandler(this);
List<SavedLocation> test = db.getAllLocationDescriptions();
for (SavedLocation cn : test){
String log = "ID: "+ cn.getID()+ ", Location:" + cn.getLocation() + ", Accuracy:"+ cn._accuracy+ ", Description: " +cn._description+ ", Provider:" + cn.getProvider();
Log.d("Location: ", log);}
setListAdapter (new ArrayAdapter<SavedLocation>(this, R.layout.list_test,test));
ListView listView = getListView();
listView.setTextFilterEnabled(true);
}
}
这是我的xml布局
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView0"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</TextView>
现在正如我所说,我没有收到错误,但我觉得我得到的更令人沮丧;我的数据库中有4条记录,这是我在运行应用程序时一直得到的输出:
看起来我能够填充列表视图,我只是做错了。
答案 0 :(得分:3)
TextViews显示com.example.gpstest1.SavedLocation@41eb8128
等信息的原因是您没有覆盖toString()
类中的SavedLocation
方法。
ArrayAdapter类不知道如何将Java对象转换为可读格式。它无法读懂您的想法并确定SavedLocation
的有效文本表示形式。它能做的最好就是在你的对象上调用toString()
并希望最好。
根据Object.toString()
文档,toString()
的默认实现执行此操作:
Object类的toString方法返回一个由。组成的字符串 对象是实例的类的名称,at-sign 字符“@”,以及散列的无符号十六进制表示 对象的代码。换句话说,此方法返回一个相等的字符串 取值为:getClass()。getName()+'@'+ Integer.toHexString(hashCode())
您有几个选择。最简单的方法就是覆盖toString()
中的SavedLocation
,并输出您想要的内容。如果您真的只想要一个TextView来表示每个条目,这将很有效。
如果你想要一个更复杂的布局,你需要创建一个自己的ArrayAdapter子类来覆盖getView()
,为ListView中的每一行生成适当的View。
答案 1 :(得分:0)
我最后改变了:
@Override
public void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Intent intent = getIntent();
DatabaseHandler db = new DatabaseHandler(this);
List<SavedLocation> test = db.getAllLocationDescriptions();
for (SavedLocation cn : test){
String log = "ID: "+ cn.getID()+ ", Location:" + cn.getLocation() + ", Accuracy:"+ cn._accuracy+ ", Description: " +cn._description+ ", Provider:" + cn.getProvider();
Log.d("Location: ", log);}
setListAdapter (new ArrayAdapter<SavedLocation>(this, R.layout.list_test,test));
ListView listView = getListView();
listView.setTextFilterEnabled(true);
为:
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list_main);
Intent intent = getIntent();
displayList();
}
public void displayList(){
Cursor cursor=db.getAllLocationsCursor();
String from [] = new String[] {db.COLUMN_DESCRIPTION, db.COLUMN_LOCATION, db.KEY_ID};
int to [] = new int[]{R.id.textView1, R.id.textView2, R.id.textView3 };
dataAdapter = new SimpleCursorAdapter(this, R.layout.row_item, cursor, from, to, 0);
ListView lv = getListView();
lv.setAdapter(dataAdapter);
}
如果我的术语正确,我正在使用“游标适配器”来完成这个......?