0
String[] temp = new String[adapter.getCount()];

        for(int i = 0; i < adapter.getCount(); i++)
            temp[i] = adapter.getItem(i).toString();


        List<String> list = Arrays.asList(temp);

        Collections.sort(list);

        adapter.clear();

        comment = new Comment();

        for(int i = 0; i < temp.length; i++)
        {
            comment.setComment(temp[i]);
            System.out.println("comment is: " + comment.getComment());
            adapter.insert(comment, i);
            System.out.println("adapter is: " + adapter.getItem(i));

        }

        for(int i = 0; i < adapter.getCount(); i++)
            System.out.println(adapter.getItem(i));

上面的代码对输入的 ArrayAdapter 进行排序;一个助手类,因为我正在使用 SQLiteHelper 和 SQL 数据库。

好的,所以我在清除 ArrayAdapter 中的所有数据后验证数据是否按字典排序顺序添加。

但是,当我到达最后一个 for 循环来验证这一点时,ArrayAdapter 已经在每个索引处复制了列表中的最后一项。这很奇怪,对我来说毫无意义。当然这也反映在屏幕上。

你能提供帮助以了解发生了什么吗?

4

2 回答 2

1

adapter.notifyDataSetChanged()完成所有修改后调用..

于 2012-04-18T13:27:42.167 回答
1

您在整个 ArrayAdapter 中使用相同的“评论”实例。因此,ArrayAdapter 的所有位置都具有完全相同的“注释”对象引用。此单个实例已设置为原始列表中的最终字符串,因此所有 ListView 项目看起来都相同。解决方案是将“注释”的实例化移动到 for 循环中,以便为每个适配器位置创建一个唯一的“注释”实例。我还稍微优化了您的代码。

// -- Count used repeatedly, particularly in for loop - execute once here.
int orgCount = adapter.getCount();

String[] temp = new String[orgCount];

for(int i = 0; i < orgCount; i++)
    temp[i] = adapter.getItem(i).toString();


List<String> list = Arrays.asList(temp);

Collections.sort(list);

// -- Prevent ListView refresh until all modifications are completed.
adapter.setNotifyOnChange(false);
adapter.clear();


for(int i = 0; i < temp.length; i++)
{
    // -- Instantiation moved here - every adapter position needs a unique instance.
    comment = new Comment();
    comment.setComment(temp[i]);
    System.out.println("comment is: " + comment.getComment());
    // -- Changed from insert to add.
    adapter.add(comment);
    System.out.println("adapter is: " + adapter.getItem(i));
}

for(int i = 0; i < adapter.getCount(); i++)
    System.out.println(adapter.getItem(i));

// -- Auto notification is disabled - must be done manually.
adapter.notifyDataSetChanged(true);
// -- All modifications completed - change notfication setting if desired.
adapter.setNotifyOnChange(true);

编辑 另外,由于您一次插入/添加一个,您可能希望将 notifyDataSetChanged 延迟执行,直到所有修改完成后。这将阻止 ListView 在每次修改时刷新。我已将其包含在上面的代码中。

于 2012-05-22T00:05:13.983 回答