我正在尝试使用数据库中的列填充ListView。我可以成功实现这一点,但问题是我想使用不同的布局资源,具体取决于id是否与PendingIntent匹配。
这是为了检查rowid是否存在警报,我计划在列表视图中显示视觉反馈,以向用户显示存在哪些警报。我可以成功地检查针对PendingIntents的rowid并获得一个返回布尔值。
我遇到的问题是使用不同行的不同布局资源填充ListView(这是否可能?)我不知道从哪里开始。
我目前有以下代码:
for(int x = 0; x < numNotes; x++) {
if(existAlarm(intarray[x])){
String[] from = new String[] { TodoDbAdapter.KEY_SUMMARY };
int[] to = new int[] { R.id.label1};
cursor = dbHelper.fetchTodo(intarray[x]);
SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
R.layout.todo_row_green, cursor, from, to);
setListAdapter(notes);
} else if (!existAlarm(intarray[x])){
String[] from = new String[] { TodoDbAdapter.KEY_SUMMARY };
int[] to = new int[] { R.id.label};
cursor = dbHelper.fetchTodo(intarray[x]);
SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
R.layout.todo_row, cursor, from, to);
setListAdapter(notes);
}
}
但ListView只显示循环中的最终数据库条目。
我将非常感谢任何指导,谢谢。
答案 0 :(得分:3)
当然,只会显示最后一项。这是因为每次进入循环并执行时都会不断更改列表适配器。摆脱循环。
如果我理解正确,您需要显示绿色行或不显示,具体取决于ToDo。如果是这样,编写自己的列表适配器,它是SimpleCursorAdapter的子类。然后覆盖newView (Context context, Cursor cursor, ViewGroup parent)
方法以选择用于显示行的视图。 cursor
参数已经移动到正确的位置,因此您可以从数据库中检索值以进行任何必要的比较。
例如:我假设您(根据fetchTodo(intarray [x]))根据ToDo的id进行比较。在这种情况下,您的代码可能如下所示:
public View newView (Context context, Cursor cursor, ViewGroup parent){
long id = cursor.getLong(TodoDbAdapter.ROW_ID_COLUMN);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (existAlarm(id)){
return inflater.inflate(R.layout.todo_row_green, null);
} else {
return inflater.inflate(R.layout.todo_row, null);
}
}
我不知道我是否理解您的代码,但您可以根据自己的需要进行调整。
答案 1 :(得分:0)
很可能在每一行中使用不同的视图:但是你不能使用标准的SimpleCursorAdapter:你必须重载getView()函数。一个例子是在Trying to override getView in a SimpleCursorAdapter gives NullPointerExceptio(在帖子中回答了一些错误,但基本技术是正确的。)
至于仅显示最后一篇文章,您的代码正在为每一行创建一个新的SimpleCursorAdapter,这是不正确的。你想使用getView()覆盖,然后在那里进行for循环和比较。