我正在编写IM客户端,我需要下载(从文件系统或网络)并在ListView的顶部显示新元素(它是消息的历史记录 - 旧消息位于顶部,更新 - 在底部)。我为ListView实现了自己的Adapter,但是我无法在列表的开头添加新元素并重新绘制它。 (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();
,但它会例外。
答案 0 :(得分:1)
我建议先颠倒List的顺序,先显示最新的结果。
运行此示例:
public class Example extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String[] array = {"oldest", "older", "old", "new", "newer"};
List<String> list = new ArrayList<String>();
Collections.addAll(list, array);
Collections.reverse(list);
// When you want to add new Strings, put them at the beginning of list
list.add(0, "newest");
ListView listView = (ListView) findViewById(R.id.list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
}
}
您不必以这种方式覆盖ArrayAdapter或ListView中的任何内容。
答案 1 :(得分:0)
您可以在与列表视图关联的类中以编程方式添加一些视图。例如:
将内容添加到布局并创建新元素:
TextView tv = new TextView(getApplicationContext());
EditText edit = new EditText(getApplicationContext());
relative.addView(tv);
relative.addView(edit);
这是为了操纵xml布局中的现有元素:
final TextView tv = (TextView) v.findViewById(R.id.listItem);
tv.setText("This an item I am changing");
如果您查看一些相关问题,他们会提供您的更多信息。但您也可以在线查看其他人的自定义列表视图和适配器。这个非常好:http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/