IMクライアントを作成していて、(ファイルシステムまたはネットワークから)ダウンロードして、ListViewの上部に新しい要素を表示する必要があります(メッセージの履歴です。古いメッセージが上部に、新しいメッセージが下部に表示されます)。ListView用に独自のアダプタを実装しましたが、リストの先頭に新しい要素を追加して再描画することができません。(notifyDataSetChanged()は、ListViewのメッセージのインデックスが変更され、Androidが正常に再描画できないため、私には適していません)。
他のアプリはどのように同様のことをしますか?
特別なコードは作成しません。ListView用の新しいアダプターを作成するだけです。
messagesListView.setAdapter(new MessagesListAdapter(this));
そして、MessagesListAdapterでgetView()メソッドとgetCount()メソッドを再定義します(ArrayAdapterを拡張します)。
ListViewの私のXMLは
<ListView
android:id="@+id/dialog_messages_list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_marginTop="@dimen/title_height">
</ListView>
そして、1つの要素(1つのメッセージ)のXMLは
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/dialogMessageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:background="@drawable/dialog_message_in"
/>
<TextView
android:id="@+id/dialogMessageDatetime"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""/>
</LinearLayout>
他のコードが必要かもしれませんか?
編集:私は試しました
messagesListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList));
(new Thread() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
arrayList.add(0, "qwer");
}
}).start();
しかし、それも良くないようです。スレッドで呼び出そうとしまし((ArrayAdapter<String>)messagesListView.getAdapter()).notifyDataSetChanged();
たが、例外になります。