如何在列表视图中显示对象

时间:2014-08-12 20:10:29

标签: android sqlite listview listadapter

我正在尝试使用从数据库中选择所有查询来填充列表视图(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条记录,这是我在运行应用程序时一直得到的输出:

  • com.example.gpstest1.SavedLocation@41eb8128 com.example.gpstest1.SavedLocation@41eb8218 com.example.gpstest1.SavedLocation@41eb8270 com.example.gpstest1.SavedLocation@41eb82c8

看起来我能够填充列表视图,我只是做错了。

2 个答案:

答案 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);
    }

如果我的术语正确,我正在使用“游标适配器”来完成这个......?