Android 将新元素添加到ListView的顶部

Android 将新元素添加到ListView的顶部,android,listview,Android,Listview,我正在编写一个IM客户机,我需要下载(从文件系统或网络)并在ListView的顶部显示新元素(它是消息的历史记录——旧消息在顶部,新消息在底部)。我为ListView实现了自己的适配器,但我不能在列表的开头添加新元素并重新绘制它。(notifyDataSetChanged()对我不好,因为ListView中消息的索引发生了变化,android无法正常重画) 其他应用程序如何做类似的事情 我没有为它创建特殊代码,我只是为我的ListView创建新的适配器: messagesListView.set

我正在编写一个IM客户机,我需要下载(从文件系统或网络)并在ListView的顶部显示新元素(它是消息的历史记录——旧消息在顶部,新消息在底部)。我为ListView实现了自己的适配器,但我不能在列表的开头添加新元素并重新绘制它。(notifyDataSetChanged()对我不好,因为ListView中消息的索引发生了变化,android无法正常重画)

其他应用程序如何做类似的事情

我没有为它创建特殊代码,我只是为我的ListView创建新的适配器:

messagesListView.setAdapter(new MessagesListAdapter(this));
并在MessagesListAdapter(现在扩展ArrayAdapter)中重新定义getView()和getCount()方法

我的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是


您可能需要其他代码

编辑:我试过了

    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();
messagesListView.setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,arrayList));
(新线程(){
公开募捐{
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
添加(0,“qwer”);
}
}).start();

但这似乎也不好。我试图调用
((ArrayAdapter)messagesListView.getAdapter()).notifyDataSetChanged()在线程中,但会出现异常。

您可以通过编程方式在与列表视图关联的类中添加一些视图。例如:

要将内容添加到布局并创建新元素,请执行以下操作:

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

如果你看一些相关的问题,他们会给你更多的信息。但您也可以在线签出其他人的自定义列表视图和适配器。这个非常好:

我建议颠倒列表的顺序,首先显示最新的结果

运行以下示例:

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);
    }
}
公共类示例扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
字符串[]数组={“最旧的”、“较旧的”、“旧的”、“新的”、“较新的”};
列表=新的ArrayList();
Collections.addAll(列表、数组);
收款。反向(列表);
//当您想添加新字符串时,请将它们放在列表的开头
列表。添加(0,“最新”);
ListView ListView=(ListView)findViewById(R.id.list);
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,list);
setAdapter(适配器);
}
}

您不必以这种方式覆盖ArrayAdapter或ListView中的任何内容。

请发布相关代码和收到的任何错误。有很多方法可以做到这一点。我会关注历史如何排序,而不是ListView或适配器。对不起,@Sam,我对StackOverflow评论很熟悉。很抱歉例如,历史只是ArrayList,但有时我想在它的开头添加新元素。如果简单的话,可能是德克。我理解你的问题了吗?好的,你在哪里创建ArrayList来填充ListView?它在另一个线程中创建,ListView通过另一个类的静态字段访问它。你能发布你在哪里创建和填充ArrayList吗?但是根据documentoin()我不能向ListView添加视图。我真的不能,我得到了异常。@jeremy-d,我得到了“java.lang.UnsupportedOperationException:addView(View)在AdapterView中不受支持”
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);
    }
}