2011-05-05 119 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(); 
相關問題