使用不同的行布局填充单个ListView

时间:2011-05-05 20:05:07

标签: java android sqlite android-listview

我正在尝试使用数据库中的列填充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只显示循环中的最终数据库条目。

我将非常感谢任何指导,谢谢。

2 个答案:

答案 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循环和比较。