【发布时间】:2012-07-01 18:27:56
【问题描述】:
我正在编写一个 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>
我的一个元素(一条消息)的 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();,但它异常。
【问题讨论】:
-
请发布相关代码和您收到的任何错误。有许多方法可以做到这一点。我会关注历史的排序方式,而不是 ListView 或 Adapter。
-
对不起,@Sam,我很早就精通 StackOverflow cmets。对不起。例如,历史只是 ArrayList
,但有时我想在它的开头添加新元素。如果它很简单,它可能是 Deque。我理解你的问题正确吗? -
好的,你在哪里创建 ArrayList
来填充 ListView? -
它在另一个线程中创建,ListView访问它抛出另一个类的静态字段。
-
您会发布您创建和填充 ArrayList
的位置吗?