218 votes

ListView horizontal dans Android ?

Est-il possible de rendre le ListView horizontalement ? Je l'ai fait en utilisant une vue de galerie, mais l'élément sélectionné se retrouve automatiquement au centre de l'écran. Je ne veux pas que l'élément sélectionné se trouve à l'endroit où j'ai cliqué. Comment puis-je rectifier ce problème ? Mon idée était de définir le paramètre ListView avec un défilement horizontal. Partagez votre idée ?

1 votes

Utiliser ce lien de mon post pour créer Horizontal listView j'espère qu'il vous aidera.

2 votes

@Indra le blog que vous avez mentionné a été supprimé.

0 votes

Vous pouvez consulter cet exemple thedeveloperworldisyours.com/Android/

119voto

Paul Points 1578

Après avoir lu cet article, j'ai implémenté mon propre listview horizontal. Vous pouvez le trouver : http://www.dev-smart.com/?p=34 Faites-moi savoir si cela vous aide...

60voto

Malachiasz Points 1537

Paul ne prend pas la peine de corriger les bugs de sa bibliothèque ou d'accepter les corrections des utilisateurs. C'est pourquoi je suggère une autre bibliothèque qui a une fonctionnalité similaire :

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 de Android 4.2.2 ListView. Je dois dire qu'elle n'a pas toutes les erreurs que la version précédente avait et fonctionne très bien !

2 votes

Cette réponse devrait être acceptée, car cette HorizontalVariableListView est beaucoup plus avancée que celle de Paul. Par exemple, elle dispose d'une méthode appropriée pour sélectionner la position dans une liste, celle de Paul a "TODO : implement someday" à la place.

5 votes

Notez que cette solution nécessite Android 2.3 ou plus.

1 votes

L'HorizontalVariableListView de sephiroth74 est exactement ce que vous espérez qu'il soit : Une copie de la ListView du code source d'Android avec tous des méthodes mises à jour pour se déplacer horizontalement plutôt que verticalement. Je n'ai pas encore rencontré de problème. Merci beaucoup de m'y avoir dirigé, Malachiasz !

28voto

Xavi Gil Points 4088

La réponse de @Paul renvoie vers 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). J'ai lutté pendant un certain temps 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 remplacer dispatchTouchEvent contourner onTouchEvent . Utilisez le même code de dispatchTouchEvent et supprimer la méthode (vous pouvez lire la différence entre les deux ici http://developer.Android.com/guide/topics/ui/ui-events.html#EventHandlers )

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = mGesture.onTouchEvent(event);
    return handled;
}

Ensuite, ajoutez le code suivant qui décidera de voler l'événement des enfants de l'élément et de le donner à notre élément onTouchEvent ou laissez-les s'en charger.

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch( ev.getActionMasked() ){
        case MotionEvent.ACTION_DOWN:
             mInitialX = ev.getX();
             mInitialY = ev.getY();             
             return false;
        case MotionEvent.ACTION_MOVE:
             float deltaX = Math.abs(ev.getX() - mInitialX);
             float deltaY = Math.abs(ev.getY() - mInitialY);
             return ( deltaX > 5 || deltaY > 5 );
        default:
             return super.onInterceptTouchEvent(ev);
    }
}

Enfin, n'oubliez pas de déclarer les variables de votre classe :

private float mInitialX;
private float mInitialY;

13 votes

Pourquoi n'envoyez-vous pas cette demande à Paul ?

0 votes

Ev.getActionMasked() n'est pas disponible sur la plateforme Android 2.1. Savez-vous comment surmonter ce problème ?

0 votes

Il semble que je puisse utiliser int maskedAction = ev.getAction() & MotionEvent.ACTION_MASK qui devrait être égal à ev.getMaskedAction()

21voto

Abhay Buch Points 1748

C'est un peu (très) tard, mais je poste ceci au cas où quelqu'un passerait par là plus tard.

La bibliothèque de support à partir de l'aperçu d'Android L a une RecyclerView qui fait exactement ce que vous voulez.

Pour l'instant, vous ne pouvez l'obtenir qu'à travers le SDK de l'aperçu L et vous devez définir votre minSdk a L . Mais vous pouvez copier tous les fichiers nécessaires dans votre projet et les utiliser de cette façon jusqu'à la sortie officielle de L.

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.

Mise à jour de

Le code source du listview horizontal est le suivant :

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

0 votes

Bonjour, est-ce que ça marche ? parce que j'ai essayé et je n'arrive pas à faire un RecyclerView horizontal. Pouvez-vous mettre un peu de code ?

0 votes

Il suffit de définir le LinearLayoutManager - voir ici : stackoverflow.com/questions/28460300/

19voto

Siddhpura Amit Points 3562

Téléchargez le fichier jar à partir de ici

Placez-le maintenant dans votre dossier libs, cliquez dessus avec le bouton droit de la souris et sélectionnez "Ajouter comme bibliothèque".

maintenant dans main.xml mettez ce code

 <com.devsmart.android.ui.HorizontalListView
    android:id="@+id/hlistview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

maintenant dans la classe Activity si vous voulez une liste horizontale avec des images, mettez ce code

  HorizontalListView hListView = (HorizontalListView) findViewById(R.id.hlistview);
    hListView.setAdapter(new HAdapter(this));

 private class HAdapter extends BaseAdapter {

    LayoutInflater inflater;

    public HAdapter(Context context) {
        inflater = LayoutInflater.from(context);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return Const.template.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listinflate, null);
            holder = new HViewHolder();
            convertView.setTag(holder);

        } else {
            holder = (HViewHolder) convertView.getTag();
        }
        holder.img = (ImageView) convertView.findViewById(R.id.image);
        holder.img.setImageResource(Const.template[position]);
        return convertView;
    }

}

class HViewHolder {
    ImageView img;
}

0 votes

Il ne prend en charge aucun sélecteur, ni aucun sélecteur personnalisé ? une idée ?

0 votes

Puis-je ajouter un tableau de chiffres à la place des images ?

0 votes

@BeingSrv oui vous pouvez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X