2011-05-05 115 views
30

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

可以这样莫名其妙地反转,使得新项目在列表(“反转录模式”)

方法stackFromBottom比较合适的顶部自动添加,但没有做自动滚动输入变化。

有没有人有一些例子代码,其中列表不断添加的东西总是插在顶部?我在正确的轨道上吗?

更新

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

+1

你想让它“滚动”(平滑或以其他方式),或者你只是想让它跳/留在最近添加的项目作为列表中的第一个(顶部)项目。如果这是你想要的第二种行为,那么在你的适配器的索引0处添加一个新项目后,调用ListView的'setSelection(0)'方法。 – Squonk 2011-05-05 22:20:50

回答

42

嗯,好吧,如果我要试试这个,我会做类似如下:

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)。

+0

这不起作用 – 2013-11-06 09:41:53

+0

我不明白“物品”和“objectList”是什么? – 2013-12-23 16:43:20

+0

这对我有用'items.add(0,obj); listAdapter.notifyDataSetChanged();'但不是循环的3º行:'listView.scrollTo(0,0);' – 2014-03-31 23:55:10

7

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

+0

(请注意,脚本模式会立即滚动而不是平滑滚动) – 2011-05-05 23:19:48

+0

嗯,如果你对此感觉强烈,你可以使用'scrollTo'。 – Femi 2011-05-06 00:17:43

7

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

的问题是,你要到另一个50个或100 记录动态地添加到顶部,但滚动应该从哪里添加 预谋项目持续。

你做一个notifyDataSetChanged的那一刻,ListView控件将自动在第一项位置数据在那之前在新项目得到了插入的位置的位置设置和NOT。

这使得它看起来像你的名单刚跳过50或100条记录。 我相信TranscriptMode设置正常不是解决方案。该列表视图需要作为普通列表视图工作,并且需要以编程方式滚动到列表底部以模拟TranscriptMode,因为它在“普通”下运行。

2

尝试使用

LinkedList items = new LinkedList<Object>(); 

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

不要使用LinkedList读取数据,因为LinkedList比读取数据的ArrayList慢,但LinkedList在列表中添加数据的速度更快。 – GeneralKimi 2014-11-02 06:30:52

8

,而不是这样的:

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); 
      } 
      }); 
+1

为你而战的男人.. – 2015-08-07 23:24:12

+1

请原谅我问一个天真的问题,但这种解决方案如何比接受的答案更好? – Darpan 2015-08-20 08:55:36

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); 
     ... 
0

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

list.add(0,editTextSName.getText().toString()); 
adapter.notifyDataSetChanged(); 
相关问题