我有一个包含表的SQLite数据库。我想使用ListActivity和ListView显示表的内容。问题是它只显示这个
database.VesproModel@41814440
VesproModel.java类只保存表的字段及其getter和setter。 我能够通过从设备中提取数据库并在计算机上查看数据,将数据成功插入到我已验证的表中。
这就是我处理数据的方式:
public List<VesproModel> getAllComments() {
List<VesproModel> comments = new ArrayList<VesproModel>();
Cursor cursor = database.query(MySQLiteHelper.TABLE_TPCS_VESSEL, allColumns, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
VesproModel comment = cursorToComment(cursor);
comments.add(comment);
cursor.moveToNext();
}
cursor.close();
return comments;
}
private VesproModel cursorToComment(Cursor cursor) {
VesproModel comment = new VesproModel();
Log.d("cursorToComment", "Before if cursorToComment");
if( cursor != null && cursor.moveToFirst() ){
Log.d("cursorToComment", "inside cursorToComment");
comment.setId(cursor.getLong(0));
comment.setImo_number(cursor.getString(1));
...
...
...}
return comment;
}
我在ListActivity中调用此函数是这样的:
public class CurrentList extends ListActivity {
private VesproDataSource datasource;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.currentlist);
datasource = new VesproDataSource(this);
datasource.open();
List<VesproModel> values = datasource.getAllComments();
ArrayAdapter<VesproModel> adapter = new ArrayAdapter<VesproModel>(this,
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
}
}
这是上面ListActivity的相应布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</ListView>
</LinearLayout>
如何在屏幕上的表格中显示数据。请提供我应该使用的布局类型,因为表格中有很多列。感谢。
编辑1:
正如所建议的,我创建了一个自定义类来扩展ArrayAdapter类来处理显示Vespromodel变量:
public class ItemAdapter extends ArrayAdapter<VesproModel> {
private List<VesproModel> objects;
public ItemAdapter(Context context, int textViewResourceId, List<VesproModel> objects) {
super(context, textViewResourceId, objects);
this.objects = objects;
}
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_item, null);
}
if (i != null) {
// I inserted some textviews to test the data out. For the final display , I would need many more textviews or a TableLayout
TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView ttd = (TextView) v.findViewById(R.id.toptextdata);
TextView mt = (TextView) v.findViewById(R.id.middletext);
TextView mtd = (TextView) v.findViewById(R.id.middletextdata);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);
TextView btd = (TextView) v.findViewById(R.id.desctext);
if (tt != null){
tt.setText("Imo_number: ");
}
if (ttd != null){
ttd.setText(i.getImo_number());
}
if (mt != null){
mt.setText("Vessel Name : ");
}
if (mtd != null){
mtd.setText(i.getVessel_name());
}
if (bt != null){
bt.setText("Vessel_type : ");
}
if (btd != null){
btd.setText(i.getVessel_type());
}
}
return v;
}
}
我从ListActivity这样调用它:
List<VesproModel> values = dsrc.getAllComments(); // function is defined in the above section.
m_adapter = new ItemAdapter(this, R.layout.list_item, values);
setListAdapter(m_adapter);
现在,活动陷入了getAllComments()方法内的无限循环。
答案 0 :(得分:2)
ListView
不知道如何显示VesproModel
的值,这就是显示VesproModel
类名称的原因。你想要的是实现自己的适配器,该适配器将知道如何从类的对象中获取数据。
或者如果VesproModel
类有例如您要显示的字段 - 我们称之为text
- 您可以使用ArrayAdapter<String>
代替ArrayAdapter<VesproModel>
,然后:< / p>
List<VesproModel> values = datasource.getAllComments();
ArrayList<String> valuesToDisplay = new ArrayList<String>();
for(VesproModel vm : values) {
valuesToDisplay.add(vm.text);
}
ArrayAdapter<String> adapter = new ArrayAdapter<VesproModel>(this,
android.R.layout.simple_list_item_1, valuesToDisplay);
setListAdapter(adapter);
这样你就有了字符串列表,ArrayAdapter
知道如何显示这些字符串。
如果您需要更多信息,请告诉我,所以我会给出更清楚的解释。
答案 1 :(得分:1)
您在ResourceId
中使用的ArrayAdapter
仅接受字符串,因此值对象必须是字符串类型的Arraylist
。
现在,您需要创建一个扩展ArrayAdapter<VesproModel>
的适配器,然后创建自己的行以在getView
的{{1}}方法中显示注释。
创建适配器后, 你可以这么称呼它。
ArrayAdapter
其中 MyAdapter<VesproModel> adapter = new MyAdapter<VesproModel>(this,
R.layout.your_layout, values);
答案 2 :(得分:0)
Moquitos的回答是正确的。另一种方法是在自定义类toString()
中覆盖VesproModel
方法。然后,它会打印database.VesproModel@41814440
中的任何内容而不是toString()
。例如,遵循Mosquitos方法,你可以做这样的事情:
@Override
public String toString(){
return text;
}