Android数据库 - 游标和适配器

时间:2015-02-21 18:58:26

标签: android

Android开发的新手,可以管理更简单的任务,但以前从未处理过数据库。我设法到目前为止,当尝试输出已创建的数据库的所有结果时,我只接收对记录的引用而不是实际值。调试显示正确分配值,但是显示对象引用而不是它们自己的值。我看到的是一个类似于:

的列表

com.example.testdb.myapplication.Films@42ff37f0

请参阅下面的代码:

// Getting All Films
    public List<Films> getAllFilms() {
        List<Films> filmList = new ArrayList<Films>();
        // Select All Query
        String selectQuery = "SELECT  * FROM film_table";

        SQLiteDatabase db = new MyDBHandler(this).getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        ArrayAdapter<Films> adapter = new ArrayAdapter<Films>(MainActivity.this, android.R.layout.simple_list_item_1,filmList);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Films film = new Films();
                film.setID(Integer.parseInt(cursor.getString(0)));
                film.setfilmName(cursor.getString(1));
                film.setFilmActors(cursor.getString(2));
                film.setFilmDirectors(cursor.getString(3));
                film.setfilmDescription(cursor.getString(4));
                film.setfilmFave(cursor.getString(5));
                ListView listView = (ListView) findViewById(android.R.id.list);
                listView.setAdapter(adapter);
                filmList.add(film);

            } while (cursor.moveToNext());
        }

        // return Film list
        return filmList;
    }

我非常感谢任何可以指导我朝正确方向发展的意见。我尝试了很多方法都无济于事。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

好的,我必须在这里猜一点,因为你没有发布更多的代码。

您说您有一个列表,显示Films对象的默认toString()方法的输出。

我猜你的列表适配器正在使用默认的getView()方法,因为默认行为是打印项目的toString()输出。

如果要将Films对象的数据库值格式化为列表,则必须扩展列表适配器类(如BaseAdapter)或创建实现ListAdapter的类,然后覆盖getView()创建包含值的视图的方法。

查看ListAdapter.getView(),看看是否能解决您的问题。如果没有,您将不得不发布更多代码,并更具体地了解正在发生的事情。

答案 1 :(得分:0)

在从数据库检索值之前设置适配器,因此适配器中没有数据。从DB中检索值并在Films对象中设置后,移动设置适配器。

public List<Films> getAllFilms() {
        List<Films> filmList = new ArrayList<Films>();
        // Select All Query
        String selectQuery = "SELECT  * FROM film_table";

        SQLiteDatabase db = new MyDBHandler(this).getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);


        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Films film = new Films();
                film.setID(Integer.parseInt(cursor.getString(0)));
                film.setfilmName(cursor.getString(1));
                film.setFilmActors(cursor.getString(2));
                film.setFilmDirectors(cursor.getString(3));
                film.setfilmDescription(cursor.getString(4));
                film.setfilmFave(cursor.getString(5));
                filmList.add(film);

            } while (cursor.moveToNext());
        }
ArrayAdapter<Films> adapter = new ArrayAdapter<Films>(MainActivity.this, android.R.layout.simple_list_item_1,filmList);
ListView listView = (ListView) findViewById(android.R.id.list);
listView.setAdapter(adapter);
return filmList;

}

还添加自定义适配器以显示Film类中的值:

public class MyClassAdapter extends ArrayAdapter<Films> {

    private static class ViewHolder {
        private TextView filmname;
        private TextView actors;
        ................
    }

    public MyClassAdapter(Context context, int textViewResourceId, ArrayList<Films> items) {
        super(context, textViewResourceId, items);
    }

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

        if (convertView == null) {
            convertView = LayoutInflater.from(this.getContext())
                    .inflate(R.layout.film_layout, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.itemView = (TextView) convertView.findViewById(R.id.ItemView);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Films item = getItem(position);
        if (item!= null) {
            // My layout has only one TextView
            // do whatever you want with your string and long
            viewHolder.itemView.setText(String.format("%s", item.getfilname));
        }

        return view;
    }
}

listrow的布局(film_layout.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/filname"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:layout_weight="1"/>
         .................... //Form how each row should be displayed    

 </RelativeLayout> 

教程如何创建自定义列表视图here

答案 2 :(得分:0)

抱歉,我没有尽快发布。最后我使用下面的代码修复了这个问题,输出到类似于你回答的列表中,但没有浮动元素......

String[] columnName = new String[]
            {MyDBHandler.COLUMN_NAME, MyDBHandler.COLUMN_ACTORS, MyDBHandler.COLUMN_DIRECTORS,MyDBHandler.COLUMN_DESCRIPTION, MyDBHandler.COLUMN_FAVE};
    int[] displayName = new int[]
            {R.id.filmNameEdit, R.id.filmActors, R.id.filmDirectors, R.id.filmDescription, R.id.filmFave};

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.activity_listview,cursor, columnName, displayName);
    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setAdapter(adapter);

感谢所有建议。这对我来说是最简单的答案。