2013-04-18 46 views
9

我在我的應用程序中設置了一個計時器,我可以從Web服務獲取一些信息並導致顯示列表視圖。現在我的問題是,每次計時器運行時,回滾到開始...在列表視圖中保持滾動位置

我該如何保持滾動位置與列表視圖中的每個刷新?我的代碼

部分:

runOnUiThread(new Runnable() { 
    public void run() { 
     /** 
     * Updating parsed JSON data into ListView 
     * */ 
     ListAdapter adapter = new SimpleAdapter(DashboardActivity.this, 
               all_chat, 
               R.layout.list_item, 
               new String[] { TAG_FULLNAME, 
                   TAG_DATE, 
                   TAG_MESSAGE }, 
               new int[] { R.id.fullname, 
                  R.id.date, 
                  R.id.message } 
               ); 
     // updating listview 
     setListAdapter(adapter); 
    } 
}); 

TNX。

+0

http://stackoverflow.com/a/3035521/931982 – stinepike

+0

可能重複[維護/保存/恢復滾動位置時返回到ListView](http://stackoverflow.com/questions/3014089/maintain-save -restore-scroll-position-when-returning-to-listview) – stinepike

+0

這些鏈接並不能解決我的問題,因爲我的問題是另一回事。我的列表視圖自動從Web服務接收數據,然後將位置移回到開始位置(頂部位置)....,我希望你解決我的問題...... tnx。 –

回答

6

您可以將以下屬性添加到您的xml中的ListView

android:stackFromBottom="true" 
android:transcriptMode="alwaysScroll" 

添加這些屬性,你的ListView將永遠在底部像你希望它是在聊天繪製。

,或者如果你想保持它在同一個地方它之前,更換alwaysScrollnormal

in the android:transcriptMode attribute. 

乾杯!

1

有一個good article by Chris Banes。對於第一部分,只需使用ListView#setSelectionFromTop(int)即可將ListView保持在相同的可見位置。爲了防止ListView閃爍,解決方案是簡單地阻止ListView佈置它的子項。

+1

阻止什麼? – mixel

+0

哎呦,更新了 – f2prateek

14

請勿撥打setAdapter()。做這樣的事情:

ListAdapter adapter; // declare as class level variable 

runOnUiThread(new Runnable() { 
    public void run() { 
     /** 
     * Updating parsed JSON data into ListView 
     */ 
     if (adapter == null) { 
      adapter = new SimpleAdapter(
        DashboardActivity.this, all_chat, R.layout.list_item, new String[]{TAG_FULLNAME, TAG_DATE, TAG_MESSAGE}, 
        new int[]{R.id.fullname, R.id.date, R.id.message}); 
      setListAdapter(adapter); 
     } else { 
      //update only dataset 
      allChat = latestetParedJson; 
      ((SimpleAdapter) adapter).notifyDataSetChanged(); 
     } 
     // updating listview 
    } 
}); 
+3

「allChat」和「all_chat」是同一個變量嗎?將allChat傳遞給適配器構造函數,然後更改allChat引用並不意味着將在適配器中更改allChat。 – mixel

2

我有同樣的問題,嘗試了很多的東西,以防止改變其滾動位置,列表包含:

android:stackFromBottom="true" 
android:transcriptMode="alwaysScroll" 

,而不是調用listView.setAdapter(); 無它工作,直到我發現this answer

,看起來像這樣:

// save index and top position 
int index = mList.getFirstVisiblePosition(); 
View v = mList.getChildAt(0); 
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop()); 

// ... 

// restore index and position 
mList.setSelectionFromTop(index, top); 

說明:

ListView.getFirstVisiblePosition()返回頂部可見列表項。但是這個項目可能會部分滾動到視圖外,如果你想恢復列表的確切滾動位置,你需要獲得這個偏移量。因此ListView.getChildAt(0)返回頂部列表項目的View,然後View.getTop() - mList.getPaddingTop()ListView的頂部返回其相對偏移量。然後,要恢復ListView的滾動位置,我們將ListView.setSelectionFromTop()與我們需要的項目的索引以及從ListView的頂部開始定位其頂邊的偏移量一起調用。