我正在编写一个管理学生时间表的应用程序,我遇到了演示问题。我希望所有项目按时间排序,如果有第二天应该显示列表分隔符和日期。
@Override
public void bindView(View view, Context context, Cursor cursor) {
String day = cursor.getString(cursor.getColumnIndex("DAY"));
if(day.equals(lastDay)){
separator.setVisibility(View.GONE);
}else{
separator.setText(day + " " + dayOfWeek);
lastDay = day;
separator.setBackgroundColor(Color.parseColor("#0099CC"));
}
}
不幸的是,我面临着两个问题。第一项根本没有排序,可能只有10个第一,第二个在我看来我无法控制每个单元格被绘制,这就是为什么算法与前一天的竞争根本不起作用我在每个单独的条目之间有分隔符,除了少数第一个细胞...任何想法如何解决这个问题? (顺便说一下,数据来自sqlite db) 问候, 罗伯特
答案 0 :(得分:0)
答案中的代码中没有任何排序,所以我无法帮助您解决第一个问题。
BTW,如果可能的话,你应该在SQLite级别上对数据进行排序 - 它会比任何Java代码都快。如果不可能(例如,您的排序条件不能表示为sqlite查询),则应在将数据传递给适配器之前对其进行排序。在这种情况下,您应该创建自己的BaseAdapter子类。
第二个问题是CursorAdapter的预期行为。 bindView是按需调用的,因此当您向下滚动时将调用后续项目,但是当您开始向上滚动时,将调用屏幕顶部显示的项目。阅读有关Android适配器中视图回收的更多信息。
如果要对数据进行分区,我建议创建一个具有两种视图类型的适配器 - 一个用于节标题,另一个用于实际项目。计算swapCursor()调用中添加的section项的位置,并在newView / getView中调用不同的代码。
答案 1 :(得分:0)
1,您需要按日期列对数据进行排序。查询数据库并获取光标时需要执行此操作。排序字符串将如下所示:
"DAY ASC"
第二,这是非常棘手的事情。如果您自己这样做,则必须重新映射光标位置并在getView上设置不同的视图类型,如chalup所说。我已经创建了一个库,可以为你完成所有这些工作,虽然名为SectionCursorAdapter。要自己实现这一点,请扩展SectionCursorAdapter并执行以下操作。
@Override
protected Object getSectionFromCursor(Cursor cursor) {
int columnIndex = cursor.getColumnIndex("DAY");
String day = cursor.getString(columnIndex);
return day;
}
这将为您每天提供一个新的部分。对你返回的内容很重要,你也可以按周或月来完成。