Est-il possible de faire le ListView
horizontalement? Je l'ai fait en utilisant une vue de galerie, mais l'élément sélectionné vient automatiquement au centre de l'écran. Je ne veux pas que l'élément sélectionné soit au même endroit où j'ai cliqué. Comment puis-je corriger ce problème? Mon idée était de définir le ListView
avec un défilement horizontal. Partagez votre idée?
215
Réponses:
Selon la documentation Android,
RecyclerView
c'est la nouvelle façon d'organiser les éléments dans la liste et de les afficher horizontalementAvantages:
Plus d'informations sur
RecyclerView
:Échantillon:
survivingwithandroid.com
Ajoutez simplement le bloc ci-dessous pour faire de l'
ListView
horizontale à la verticaleExtrait de code
la source
Paul ne prend pas la peine de corriger les bogues de sa bibliothèque ou d'accepter les correctifs des utilisateurs. C'est pourquoi je propose une autre bibliothèque qui a des fonctionnalités similaires:
https://github.com/sephiroth74/HorizontalVariableListView
Mise à jour : le 24 juillet 2013, l'auteur (sephiroth74) a publié une version complètement réécrite basée sur le code d'Android 4.2.2 ListView. Je dois dire qu'il n'a pas toutes les erreurs de la version précédente et fonctionne très bien!
la source
La réponse @Paul renvoie à une excellente solution, mais le code ne permet pas d'utiliser onClickListeners sur les éléments enfants (les fonctions de rappel ne sont jamais appelées). Je me bats depuis un moment pour trouver une solution et j'ai décidé de poster ici ce que vous devez modifier dans ce code (au cas où quelqu'un en aurait besoin).
Au lieu de
dispatchTouchEvent
remplacer le remplacementonTouchEvent
. Utilisez le même codedispatchTouchEvent
et supprimez la méthode (vous pouvez lire la différence entre les deux ici http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )Ensuite, ajoutez le code suivant qui décidera de voler l'événement aux enfants de l'élément et de le donner à notre
onTouchEvent
, ou de le laisser gérer par eux.Enfin, n'oubliez pas de déclarer les variables dans votre classe:
la source
Depuis que Google a introduit la bibliothèque de support Android v7 21.0.0, vous pouvez utiliser RecyclerView pour faire défiler les éléments horizontalement. Le widget RecyclerView est une version plus avancée et flexible de ListView.
Pour utiliser RecyclerView, ajoutez simplement une dépendance:
Voici un exemple:
Plus d'informations sur RecyclerView:
la source
C'est un peu (très) tard, mais je poste ceci au cas où quelqu'un viendrait plus tard.
La bibliothèque de support à partir de l'aperçu Android L a un
RecyclerView
qui fait exactement ce que vous voulez.En ce moment, vous ne pouvez l' obtenir via le SDK L de prévisualisation et vous devez configurer votre
minSdk
àL
. Mais vous pouvez copier tous les fichiers nécessaires dans votre projet et les utiliser de cette façon jusqu'à ce que L soit officiellement sorti.Vous pouvez télécharger les documents d'aperçu ici .
Avertissement: l'API pour Recycler View peut changer et il peut y avoir des bogues.
Actualisé
Le code source de la liste horizontale est:
la source
LinearLayoutManager
- voir ici: stackoverflow.com/questions/28460300/…Téléchargez le fichier jar d' ici
placez-le maintenant dans votre dossier libs, faites un clic droit dessus et sélectionnez 'Ajouter comme bibliothèque'
maintenant dans main.xml mettez ce code
maintenant dans la classe d'activité si vous voulez une vue de liste horizontale avec des images, mettez ce code
la source
C'est en fait très simple : il suffit de faire pivoter la vue de liste pour la mettre de côté
mlistView.setRotation(-90);
Ensuite, lors du gonflage des enfants, cela devrait être à l'intérieur de la méthode getView. vous faites pivoter les enfants pour qu'ils se tiennent droits:
Modifier: si votre ListView ne tient pas correctement après la rotation, placez le ListView à l'intérieur de ce RotateLayout comme ceci:
la source
Ma solution est d'utiliser simplement un
ViewPager
widget. Il n'est pas verrouillé au centreGallery
et possède des fonctionnalités intégrées pour recycler les vues (asListView
). Vous pouvez voir une approche similaire dans l'application Google Play, chaque fois que vous traitez avec des listes déroulantes horizontalement.Vous avez juste besoin d'étendre
PagerAdapter
et d'effectuer quelques ajustements:En conséquence, vous aurez un widget à défilement horizontal avec adaptateur, comme ceci:
la source
Remarque: Android prend désormais en charge les vues de liste horizontales à l'aide de RecyclerView, alors cette réponse est obsolète, pour plus d'informations sur RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView
J'ai développé une logique pour le faire sans utiliser de bibliothèque de défilement horizontal externe, voici la vue horizontale que j'ai réalisée et j'ai posté ma réponse ici: https://stackoverflow.com/a/33301582/5479863
Ma réponse json est la suivante:
Fichier de mise en page:
fichier de classe:
astuce qui fonctionne ici est l'ID que j'ai attribué à ImageView "imgView.setId (v)" et après cela, en appliquant onClickListener à cela, je récupère à nouveau l'ID de la vue .... J'ai également commenté l'intérieur du code afin que c'est facile à comprendre, j'espère que cela peut être très utile ... Happy Coding ... :)
la source
getPixelsToDP()
?Ce n'est pas vraiment une réponse, mais que diriez-vous d'utiliser une vue de défilement horizontal ?
la source
Vous pouvez utiliser RecyclerView dans la bibliothèque de support. RecyclerView est une version généralisée de ListView qui prend en charge:
Android Recycler Voir les documents
la source
J'ai fait beaucoup de recherches pour trouver une solution à ce problème. La réponse courte est qu'il n'y a pas de bonne solution, sans passer outre les méthodes privées et ce genre de choses. La meilleure chose que j'ai trouvée était de l'implémenter moi-même à partir de zéro en l'étendant
AdapterView
. C'est assez misérable. Voir ma question SO sur ListViews horizontales .la source
fillListDown()
méthode, vous devez garder une trace du bord inférieur du dernier élément de la liste. Mais vous ne savez pas où se trouve ce bord jusqu'à ce que vous ayez réellement créé le dernier élément (adapter.getCount () - 1). Vous attendez donc que cet élément soit créé, puis vous pouvez stocker l'emplacement du bord. Une fois que vous le savez, vous pouvez vous assurer que mListTop n'est jamais inférieur à 0 et jamais supérieur à la hauteur de la liste.J'ai dû faire de même pour l'un de mes projets et j'ai fini par écrire le mien aussi. Je l'ai appelé HorzListView fait maintenant partie de ma bibliothèque Aniqroid open source .
http://aniqroid.sileria.com/doc/api/ (Recherchez les téléchargements en bas ou utilisez le projet de code Google pour voir plus d'options de téléchargement: http://code.google.com/p/aniqroid/downloads/list )
La documentation de classe est ici: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html
la source
Pour mon application, j'utilise un HorizontalScrollView contenant LinearLayout à l'intérieur, dont l'orientation est définie sur horizontal. Afin d'ajouter des images à l'intérieur, je crée des ImageViews à l'intérieur de l'activité et les ajoute à mon LinearLayout. Par exemple:
Et cela fonctionne parfaitement bien pour moi. Dans l'activité, tout ce que je dois faire est quelque chose comme le code ci-dessous:
Comme je l'ai dit, cela fonctionne pour moi et j'espère que cela aidera aussi quelqu'un qui cherche à y parvenir.
la source
vous pouvez toujours créer dynamiquement vos vues de texte, etc. et définir vos écouteurs onclick comme vous le feriez avec un adaptateur
la source
HorizontialListView ne peut pas fonctionner lorsque les données de l'adaptateur sont impliquées dans un autre thread. Tout fonctionne à 100% sur le thread d'interface utilisateur. C'est un gros problème dans le multithread. Je pense que l'utilisation de HorizontialListView n'est pas la meilleure solution à votre problème.HorzListView est une meilleure façon.Vous remplacez simplement votre galerie précédente par HorzListView.Vous n'avez pas besoin de modifier le code de l'adaptateur.Ensuite, tout se passe comme vous l'espérez.Voir https: // stackoverflow.com/a/12339708/1525777 à propos de HorzListView.
la source
J'avais utilisé le lien horizontal listview dans mon projet et j'ai obtenu de bons résultats. J'avais utilisé la bibliothèque devsmart au départ, mais cela m'a posé quelques problèmes. Donc, la meilleure façon d'utiliser le lien de liste horizontale car il a récupéré mes problèmes et j'ai récemment lancé mon application sur Google PlayStore en utilisant cette bibliothèque et j'ai reçu une belle réponse des utilisateurs. Je vous recommande donc d'utiliser la même bibliothèque que celle mentionnée ci-dessus pour afficher la vue de liste horizontalement. Prendre plaisir :)
la source
Il existe une excellente bibliothèque pour cela, appelée TwoWayView , elle est très facile à implémenter, il suffit d'inclure la bibliothèque de projet dans votre espace de travail et de l'ajouter en tant que projet de bibliothèque à votre projet d'origine, puis de suivre les étapes suivantes qui sont à l'origine mentionnées ici :
Ensuite,
et enfin, déclarez-le et traitez-le comme n'importe quel habituel
ListView
:Toutes les méthodes de
ListView
fonctionneront ici comme d'habitude, mais il n'y a qu'une seule différence que j'ai remarquée, c'est que lors de la définition du mode de choix, la méthodesetChoiceMode
ne prend pas uneint
valeur mais une valeurenum
appeléeChoiceMode
, celist_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
sera le caslvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE
.la source
Vous pouvez utiliser ViewFlipper pour inclure le XML de mise en page et ajouter des images, listview pour chaque XML de mise en page
la source