Comment puis-je faire défiler par programme jusqu'à une position spécifique dans un ListView
?
Par exemple, j'ai un String[] {A,B,C,D....}
, et je dois définir l'élément le plus visible du ListView
sur l'index 21 de mon String[]
.
Comment puis-je faire défiler par programme jusqu'à une position spécifique dans un ListView
?
Par exemple, j'ai un String[] {A,B,C,D....}
, et je dois définir l'élément le plus visible du ListView
sur l'index 21 de mon String[]
.
Réponses:
Pour un défilement direct:
getListView().setSelection(21);
Pour un défilement fluide:
getListView().smoothScrollToPosition(21);
smoothScrollToPosition
ne fonctionne pas, une suggestion?
listView.post(() -> listView.smoothScrollToPosition());
getListView().smoothScrollToPositionFromTop(position,offset,duration);
Paramètres
position -> Position à faire défiler jusqu'au
décalage ----> Distance souhaitée en pixels de position à partir du haut de la vue lorsque le défilement est terminé
durée-> Nombre de millisecondes à utiliser pour le défilement
Remarque: à partir de l'API 11.
La réponse de HandlerExploit était ce que je cherchais, mais ma liste est assez longue et aussi avec un défilement alphabétique. Ensuite, j'ai trouvé que la même fonction peut également prendre d'autres paramètres :)
Edit: (De la suggestion de l'AFD)
Pour positionner la sélection actuelle:
int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();
mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);
Mettez votre code dans le gestionnaire comme suit,
public void timerDelayRunForScroll(long time) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
try {
lstView.smoothScrollToPosition(YOUR_POSITION);
} catch (Exception e) {}
}
}, time);
}
puis appelez cette méthode comme,
timerDelayRunForScroll(100);
À VOTRE SANTÉ!!!
J'ai défini OnGroupExpandListener et remplacer onGroupExpand () comme:
et utilisez la méthode setSelectionFromTop () qui définit l'élément sélectionné et positionne la sélection à y pixels à partir du bord supérieur de ListView. (S'il est en mode tactile, l'élément ne sera pas sélectionné mais il sera toujours positionné de manière appropriée.) (Android Docs)
yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
{
@Override
public void onGroupExpand(int groupPosition) {
expList.setSelectionFromTop(groupPosition, 0);
//your other code
}
});
Le Listview
défilement sera positionné en haut par défaut, mais vous voulez faire défiler s'il n'est pas visible, utilisez ceci:
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
Si quelqu'un recherche une fonctionnalité similaire comme l'application Gmail,
Le défilement Listview sera positionné en haut par défaut. Merci pour l'indice. amalBit. Il suffit de le soustraire. C'est tout.
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
int h1 = mDrawerList.getHeight();
int h2 = header.getHeight();
mDrawerList.smoothScrollToPosition(h2-h1);
}
}, 1000);
Manipulation de la liste Afficher le défilement en utilisant UP / Down avec le bouton.
Si quelqu'un est intéressé par la gestion de la liste, affichez une ligne vers le haut / bas à l'aide du bouton puis.
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
C'est ce qui a fonctionné pour moi. Combinaison de réponses par amalBit et Melbourne Lopes
public void timerDelayRunForScroll(long time) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
try {
int h1 = mListView.getHeight();
int h2 = v.getHeight();
mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);
} catch (Exception e) {}
}
}, time);
}
puis appelez cette méthode comme:
timerDelayRunForScroll(400);
sa sélection facile list-view.set (vous pos); ou vous pouvez enregistrer votre position avec sharedprefrenceand lorsque vous démarrez l'activité, il obtient les préférences et définit la suppression de cet int
-Si vous voulez juste que la liste défile vers le haut \ dawn jusqu'à une position spécifique:
myListView.smoothScrollToPosition(i);
-si vous souhaitez obtenir la position d'un élément spécifique dans myListView:
myListView.getItemAtPosition(i);
-aussi cela myListView.getVerticalScrollbarPosition(i);
peut vous aider.
Bonne chance :)
Vous avez besoin de deux choses pour définir précisément la position de défilement d'une listView:
Pour obtenir la position actuelle du défilement de la liste:
int firstVisiblePosition = listView.getFirstVisiblePosition();
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.
Pour définir la position de défilement de listView:
listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo..
listView.scrollTo(0,-topEdge);
J'ai trouvé cette solution pour permettre le défilement de haut en bas à l'aide de deux boutons différents.
Comme suggéré par @Nepster, j'implémente le défilement par programme en utilisant getFirstVisiblePosition () et getLastVisiblePosition () pour obtenir la position actuelle.
final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
.....
if (list.size() > 0) {
ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
bnt.setVisibility(View.VISIBLE);
bnt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
}else{
lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());
}
}
});
bnt = (ImageButton) findViewById(R.id.up_action);
bnt.setVisibility(View.VISIBLE);
bnt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(lwresult.getFirstVisiblePosition()>0){
lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
}else{
lwresult.smoothScrollToPosition(0);
}
}
});
}