在Android上添加新项目到列表视图的顶部?

时间:2011-05-05 20:19:48

标签: android listview

Android有transcript mode允许在将新数据添加到适配器时自动将列表视图滚动到底部。

这可以以某种方式反转,以便在列表顶部自动添加新项目(“逆转录模式”)

方法stackFromBottom似乎是正确的,但不会在输入更改时自动滚动。

有没有人有一些示例代码,其中列表不断添加始终插入顶部的内容?我在这里走在正确的轨道上吗?

更新

感谢您的回答,这让我想得更多。其实。我想让新条目显示在顶部,但屏幕仍然显示用户正在查看的项目。用户应主动滚动到顶部以查看新项目。所以我认为成绩单模式不是我想要的。

7 个答案:

答案 0 :(得分:45)

嗯,好吧,如果我要尝试这个,我会做类似以下的事情:

List items = new ArrayList();

//some fictitious objectList where we're populating data
for(Object obj : objectList) {
    items.add(0, obj);
    listAdapter.notifyDataSetChanged();
}

listView.post(new Runnable() {
    @Override
    public void run() {
        listView.smoothScrollToPosition(0);
    }
}

我不确定这会起作用,但似乎合乎逻辑。基本上,只需确保在列表的开头添加项目(位置0),刷新列表适配器,然后滚动到位置(0,0)。

答案 1 :(得分:9)

而不是:

items.add(edittext.getText().toString());
adapter.notifyDataSetChanged();

你应该尝试(适合我):

listview.post(new Runnable() {
            @Override
            public void run() {
                items.add(0, edittext.getText().toString());
                adapter.notifyDataSetChanged();
                listview.smoothScrollToPosition(0);
            }
            });

答案 2 :(得分:7)

只要添加一个smoothScrollToPosition(0),只要将东西添加到ListView中就不够了吗?不要以为有自动滚动选项。

答案 3 :(得分:7)

我花了几个小时试图完成同样的事情。从本质上讲,这就像一个聊天应用程序,用户向上滚动以查看列表顶部的旧消息。

  

问题在于,您想要动态添加另外50或100   记录到顶部但滚动应该从哪里连续   添加了前置项目。

当您执行notifyDataSetChanged时,ListView将自动定位到数据集中的第一个项目,而不是位于新项目插入位置之前的位置。

这使得您的列表看起来只跳了50或100条记录。 我认为TranscriptMode设置为正常不是解决方案。列表视图需要作为普通列表视图运行,您需要以编程方式滚动到列表的底部以模拟TranscriptMode,因为它在“正常”下运行。

答案 4 :(得分:2)

尝试使用

LinkedList items = new LinkedList<Object>();

//some fictitious objectList where we're populating data
for(Object obj : objectList) {
    items.addFirst(obj);
}
listAdapter.notifyDataSetChanged();

答案 5 :(得分:2)

这解决了问题:

...
ListView lv;
ArrayAdapter<String> adapter;
ArrayList<String> aList;
...
        lv = (ListView) findViewById(R.id.mylist);

        aList = new ArrayList<String>();
        adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, aList);
        lv.setAdapter(aAdapter);
        ...
        adapter.insert ("Some Text 1", 0);
        adapter.insert ("Some Text 2", 0);
        adapter.insert ("Some Text 3", 0);
        ...

答案 6 :(得分:0)

你应该尝试(列表位置和刷新适配器)

list.add(0,editTextSName.getText().toString());
adapter.notifyDataSetChanged();