2010-08-17 5 views
45

J'ai un ListView avec un texte d'édition et un bouton en dessous. Lorsque je clique sur un élément de listView, le clavier apparaît et augmente le texte d'édition et le bouton. Je veux que la liste défile jusqu'à l'élément sélectionné. Une idée? MerciListView faites défiler jusqu'à l'élément sélectionné

+1

voir ma réponse ici, http://stackoverflow.com/a/29345217/1881527 –

+2

double possible de [faire défiler Programmatically à une position spécifique dans un ListView Android] (http: // stackoverflow.com/questions/7561353/programatically-scroll-to-a-specific-position-in-an-android-listview) –

Répondre

4

Configurez un écouteur sur votre élément de liste en cours de clic, puis utilisez View.getTop() ou View.getBottom() lorsque vous cliquez dessus pour obtenir sa position dans le parent. Vous pouvez ensuite utiliser ListView.scrollTo(x, y) pour faire défiler jusqu'à l'élément de liste.

+0

Cela ne fonctionne pas pour moi. Si j'implémente votre exemple, le listView défile mais l'élément sélectionné n'est pas centré. – Anita

+1

@Anita: Vous n'avez rien dit au sujet du centrage ... le centrage ne prend qu'une petite modification. Il suffit d'ajouter ou de réduire à la valeur y proportionnellement à la hauteur de l'écran. – Doge

+0

Pas besoin de faire ça. –

69

Vous pouvez utiliser la méthode setSelection(int position) de ListView pour faire défiler jusqu'à une ligne.

+16

Cela n'a pas fonctionné pour moi. J'ai utilisé smoothScrollToPostion (position) à http://developer.android.com/reference/android/widget/ListView.html#smoothScrollToPosition(int). Note importante: J'ai dû l'appeler après que notifyDataSetChanged() a été appelé sur l'adaptateur. – SilentNot

+1

Notez que celui-ci vous amène à la position, mais comme dans l'autre réponse, smoothScrollToPosition y fait défiler. Les deux fonctionnent si vous voulez que l'utilisateur soit montré quelque chose donc c'est une question de comment vous voulez qu'il regarde. –

+0

comment faire défiler la liste vers le haut quand un seul élément existe? –

4

Vous devez utiliser transcript mode:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); 
42

Vous pouvez utiliser smoothScrollToPosition(int position) de ListView pour faire défiler jusqu'à un emplacement particulier dans la liste.

+1

à cause de ce bug: https://code.google.com/p/android/issues/detail?id=36062, c'est en fait une meilleure solution de contournement si vous voulez un défilement fluide: http://stackoverflow.com/questions/ 14479078/smoothscrolltopositionfromtop-is-not-always-like-it-should/20997828 # 20997828 – nommer

+0

Ce bug, tel que décrit, semble spécifique à smoothScrollToPositionFromTop. Pas sûr qu'il affecte smoothScrollToPosition ... quelqu'un sait-il? –

+1

Ne sait pas, mais à l'heure, mon 'smoothScrollToPosition()' ne semble pas fonctionner, alors que 'setSelection()' fonctionne; mais avec un crétin. – Darpan

3

Yo peut chercher

listView.setSelectionFromTop (position, distanceFromHeader);

Il positionnera le point à la position, les pixels spécifiés en dessous du haut de listview

+0

Je dois faire défiler une autre vue simultanément tout en faisant défiler lisview. L'utilisation de setSelectionFromTop sur listview pour le défilement bloque le thread UI qui ralentit le défilement d'une autre vue. Pouvez-vous donner une suggestion sur la façon de le faire? – VijayRaj

21

Pour un défilement direct:

getListView().setSelection(11); 

Pour un rouleau lisse:

getListView().smoothScrollToPosition(11); 

pour faire défiler vers le haut

getListView().setSelectionAfterHeaderView(); 

Remarque

essayer de l'appeler en poste parce que quelque temps listview est pas encore créé pendant que vous l'appelant est la méthode

getListView().postDelayed(new Runnable() {   
    @Override 
    public void run() { 
     lst.setSelection(15); 
    } 
},100L); 
1

aide la durée donne une meilleure expérience utilisateur. Utilisez ceci, avec la durée ajoutée. Fait défiler l'élément en position doucement vers le haut de la liste.

int duration = 500; //miliseconds 
int offset = 0;  //fromListTop 

listview.smoothScrollToPositionFromTop(position,offset,duration); 
  • durée de descrease pour faire défiler plus rapidement
1

Vous pouvez utiliser

smoothScrollToPosition(position) 

augmenter juste la position de l'élément avec 1, et vous obtiendrez la vue de l'article.

getListView().smoothScrollToPosition(position + 1); 
Questions connexes