2016-12-23 141 views
0

我正在開發一個聊天應用程序,我試圖一次加載10條消息,當用戶向上滾動時,它會加載10條消息。因此,我使用stackFromBottom =真來加載從底部消息:滾動列表視圖加載(Android)

<ListView 
    android:id="@+id/messagesList" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:transcriptMode="normal" 
    android:stackFromBottom="true"> 

和我有一個滾動聽者知道當用戶到達山頂(firstVisibleItem == 0,即,第一消息),所以我可以加載更多信息:

messagesList.setOnScrollListener(new AbsListView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView absListView, int i) { 
    } 
    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

     if (firstVisibleItem ==0 && !loading && !startApp) { 
      loading = true; 
      skip += 10; 
      fetchMessages = new FetchMessages(); //load more items 
      fetchMessages.execute(true); 
     } 
    } 
}); 

的問題是,當你向上滾動,並達到頂峯,10多個消息負載,但是ListView控件會自動滾動至底部。當新項目添加到Listview時,我想保持完全相同的位置,就像任何常規聊天應用程序一樣。

這是增加消息的方法:

@Override 
protected void onPostExecute(String json) { 

    if(json!=null){ 
     ... 
     //After Parse JSON ... 
     chatMessageAdapter.list.add(0,chatMessage); //add the message to the top of the list 
     chatMessageAdapter.notifyDataSetChanged(); //listview scrolls to the bottom afterwards  
    } 


    loading = false; 
    startApp = false; 

} 

我試過很多的其他線程的建議,但他們沒有實際工作。我希望有人能在這裏幫忙。

非常感謝。

回答

0

什麼我做的工作是:

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

// notify dataset changed or re-assign adapter here 

// restore the position of listview 
mList.setSelectionFromTop(index, top); 

請注意,您必須刪除的android:transcriptMode從XML =「正常」,否則將無法正常工作。