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;
}
我非常感谢任何可以指导我朝正确方向发展的意见。我尝试了很多方法都无济于事。
提前谢谢。
答案 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);
感谢所有建议。这对我来说是最简单的答案。