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

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);

編集 また、一度に1つずつ挿入/追加するため、すべての変更が完了するまで、notifyDataSetChangedの実行を遅らせることができます。これにより、変更のたびにListViewが更新されなくなります。上記のコードに含めました。

于 2012-05-22T00:05:13.983 に答える
1

adapter.notifyDataSetChanged()すべての変更が完了したら呼び出します。

于 2012-04-18T13:27:42.167 に答える