2017-10-05 7 views
0

Dans mon application, j'ai un ListView. Les données de chaque élément de la liste sont une instance de la classe SomeItem. La liste a un ArrayAdapter personnalisé qui a une vue personnalisée pour afficher différents champs de chaque élément et remplace la méthode getView(). le squelette du code pour l'initialisation de la vue de la liste:Faites défiler un élément ListView particulier dans la vue

ListView listView = (ListView) foo.getViewById(R.id.listView); 

ArrayAdapter<SomeItem> adapter = new ArrayAdapter<SomeItem>(activity, R.layout.listItemView, R.id.textView) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Code to build the view with multiple child views 
    } 
} 

Supposons maintenant que j'ai une instance SomeItem. Sa vue associée peut être ou ne pas être dans la partie du ListView qui est affichée à l'écran. Si ce n'est pas le cas, comment puis-je obtenir le ListView pour faire défiler cet élément en particulier?

La seule méthode quelque peu liée que j'ai trouvée est ListView#requestChildRectangleOnScreen(), ce qui me demande de fournir une vue enfant que je n'ai pas. J'ai l'article pour l'adaptateur. Donc, je ne suis toujours pas sûr de savoir comment assembler cela. Des pointeurs?

+0

La question n'est pas très claire. Pouvez-vous nous montrer quelque chose qui exprime votre demande sous une forme picturale? –

+0

J'ai modifié la question. Est-ce plus clair maintenant? – user149408

+0

Comment allez-vous déterminer quel élément doit être sur l'écran? Quelle est la logique que vous avez là? –

Répondre

1

Vous pouvez essayer ce qui suit:

  1. Calculer la position de l'élément SomeItem vous voulez rendre visible. Vous pouvez le faire en itérant sur la liste des SomeItem que vous transmettez à l'adaptateur.

  2. Utilisez listView.getFirstVisiblePosition(), listView.getLastVisiblePosition() et la position calculée pour vérifier si l'élément est visible dans la liste.

  3. Si l'élément n'est pas visible, faites listView en faisant défiler la liste en appelant listView.smoothScrollToPosition(calculatedPosition).

+0

Merci, semble prometteur. Je vais upvote; l'acceptation suivra une fois que je l'ai essayé avec succès. En regardant l'API, il y a 'ArrayAdapter # getPosition()' qui devrait retourner la position donc je suppose que je n'aurais pas besoin d'un itérateur. Aussi, ai-je vraiment besoin de faire # 2 ou est en train de faire défiler vers un élément qui est déjà dans la vue un vrai no-op (signifiant que la liste ne bougera pas du tout, par opposition à l'item par défaut)? – user149408

+0

Je ne me souviens pas vraiment de la façon dont 'smoothScrollToPosition()' fonctionne avec un élément déjà affiché - cela peut provoquer un petit contretemps de le placer comme un élément supérieur. Peut être pas. Ou peut-être que c'est exactement ce que vous voulez. Essayez donc de faire défiler sans * step2 * et voyez si le résultat vous satisfait. –

+0

Je l'ai essayé brièvement: défile vers le haut de la liste, sélectionne l'élément en bas de l'écran (la partie à l'écran est inférieure à la moitié de la liste) et attend que la liste se remplisse. Pas de secousses jusqu'à ce que de nouveaux éléments aient commencé à pousser la sélection hors écran, après quoi elle s'est déplacée vers le bas de l'écran et est restée là. Précisément ce que j'ai besoin! – user149408