2016-12-23 149 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 =“正常”,否则将无法正常工作。