2016-12-23 2 views
0

Je développe une application de chat et j'essaye de charger 10 messages à la fois, et quand l'utilisateur fait défiler vers le haut il charge 10 plus. donc j'utilisé stackFromBottom = true pour charger les messages à partir du bas:Listview charger sur défilement (Android)

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

Et j'ai un auditeur de défilement pour savoir quand l'utilisateur a atteint le sommet (firstVisibleItem == 0, soit le premier message) afin que je puisse charger plus de messages:

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

le problème est lorsque vous faites défiler et atteindre le sommet, 10 plus de messages charge mais le Listview défile automatiquement vers le bas. Je veux rester exactement dans la même position lorsque de nouveaux éléments sont ajoutés à la liste, comme n'importe quelle application de discussion classique.

Ceci est la méthode ajouter des messages:

@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; 

} 

J'ai essayé beaucoup des suggestions dans d'autres discussions, mais aucun d'entre eux a effectivement travaillé. J'espère que quelqu'un pourrait aider ici.

Merci beaucoup.

Répondre

0

ce qui a fonctionné pour moi était que:

// 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); 

Prenez note que vous devez supprimer android: transcriptMode = "normal" de votre xml, il serait par ailleurs pas fonctionner.