ListView horizontale dans Android?

215

Est-il possible de faire le ListViewhorizontalement? 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 ListViewavec un défilement horizontal. Partagez votre idée?

Praveen
la source
1
utilisez ce lien de mon message pour créer une liste horizontale. J'espère que cela vous aidera.
FAIZ ANWAR
2
@Indra que le blog que vous avez mentionné a été supprimé
Animesh Mangla
Vous pouvez consulter cet exemple thedeveloperworldisyours.com/android/…
Cabezas

Réponses:

123

Selon la documentation Android, RecyclerViewc'est la nouvelle façon d'organiser les éléments dans la liste et de les afficher horizontalement

Avantages:

  1. Étant donné qu'en utilisant Recyclerview Adapter, le modèle ViewHolder est automatiquement implémenté
  2. L'animation est facile à réaliser
  3. Beaucoup plus de fonctionnalités

Plus d'informations sur RecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

Échantillon:

survivingwithandroid.com

Ajoutez simplement le bloc ci-dessous pour faire de l' ListViewhorizontale à la verticale

Extrait de code

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);
Devrath
la source
1
Ce sera la meilleure solution si les problèmes avec LayoutManager sont résolus par Google. code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai
pour construire une vue simple de recycleur, utilisez cet exemple: android-examples.com/…
Matcoil
1
Ok, quelle façon pour les widgets?
Vladislav
Contrairement à d'autres vues prises en charge par l'adaptateur telles que ListView ou GridView, RecyclerView permet au code client de fournir des dispositions de disposition personnalisées pour les vues enfant. Ces dispositions sont contrôlées par RecyclerView.LayoutManager. Un LayoutManager doit être fourni pour que RecyclerView fonctionne.
Yohanes AI
RecyclerView ne peut toujours pas gérer les clics sur les éléments (ne mentionnez pas la classe RecyclerView.Selection) aussi bien et facilement que ListView - c'est l'une des rares raisons pour lesquelles je pense que RecyclerView n'est pas la meilleure réponse à cette question.
Edward Quichotte
60

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!

Malachiasz
la source
2
Cela devrait être une réponse acceptée, car cette HorizontalVariableListView est beaucoup plus avancée que celle de Paul. Par exemple, il a une méthode appropriée pour sélectionner la position dans une liste, celle de Paul a "TODO: implémenter un jour" à sa place.
Yan.Yurkin
5
Notez que cette solution nécessite Android 2.3 ou supérieur
user1032613
1
HorizontalVariableListView de sephiroth74 est exactement ce que vous espérez qu'il soit: une copie du ListView à partir du code source Android avec toutes les méthodes mises à jour pour se déplacer horizontalement plutôt que verticalement. Je n'ai encore rencontré aucun problème. Merci beaucoup de m'avoir dirigé là-bas, Malachiasz!
SilithCrowe
bien wrap_content à listview n'est toujours pas pris en charge dans cette
bibliothèque
1
Il est désormais déprécié
Animesh Mangla
28

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 dispatchTouchEventremplacer le remplacement onTouchEvent. Utilisez le même code dispatchTouchEventet 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 )

@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 aux enfants de l'élément et de le donner à notre onTouchEvent, ou de le laisser gérer par eux.

@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 dans votre classe:

private float mInitialX;
private float mInitialY;
Xavi Gil
la source
13
Pourquoi n'envoyez-vous pas cela comme une demande d'appel à Paul?
Cristian
ev.getActionMasked () n'est pas disponible sur la plateforme Android 2.1. Savez-vous comment surmonter cela?
Eugene Popovich
semble que je peux utiliser int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK qui doit être égal à ev.getMaskedAction ()
Eugene Popovich
Vraiment utile! mais en changeant le code en onTouchEvent, j'ai obtenu un décalage bizarre. Je l'ai gardé dans dispatchTouchEvent et cela fonctionne parfaitement! Merci
jbc25
jbc25 je peux confirmer que des sauts étranges se produisent si vous utilisez ce correctif
Eugene Popovich
23

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:

com.android.support:recyclerview-v7:23.0.1

Voici un exemple:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

        MyAdapter adapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(adapter);
    }
}

Plus d'informations sur RecyclerView:

klimat
la source
21

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 RecyclerViewqui 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:

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

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);
Abhay Buch
la source
Salut, ça marche? parce que j'essaye et je ne peux pas faire un RecyclerView horizontal. Pouvez-vous mettre du code? merci
Cocorico
Il suffit de régler le LinearLayoutManager- voir ici: stackoverflow.com/questions/28460300/…
Stéphane
19

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

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

maintenant dans la classe d'activité si vous voulez une vue de 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;
}
Siddhpura Amit
la source
il ne prend en charge aucun sélecteur ou aucun sélecteur personnalisé? une idée?
Nitin Misra
Puis-je ajouter un tableau de nombres au lieu d'images?
souravlahoti
@BeingSrv yes You can
Siddhpura Amit
Après l'avoir placé dans le dossier libs, faites un clic droit dessus et cliquez sur 'Ajouter comme bibliothèque'
M. Usman Khan
comment développer la liste des horizontallistview comme dans pulse, bbcnews s'il vous plaît aidez-moi
Harsha
13

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:

 mylistViewchild.setRotation(90);

Modifier: si votre ListView ne tient pas correctement après la rotation, placez le ListView à l'intérieur de ce RotateLayout comme ceci:

 <com.github.rongi.rotate_layout.layout.RotateLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:angle="90"> <!-- Specify rotate angle here -->

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent">
    </ListView>
</com.github.rongi.rotate_layout.layout.RotateLayout>
kc ochibili
la source
1
Je l'ai essayé - pas si simple. Je n'ai pas réussi à adapter la vue pivotée à la largeur et à la hauteur de l'écran. Et cette API n'est disponible que sur les nouveaux appareils.
Malachiasz
Avant de faire pivoter, définissez la largeur de listViews sur la hauteur de l'écran Et définissez la hauteur de listviews sur la largeur des écrans. .
kc ochibili
1
as-tu essayé ce que tu dis? J'ai et rien de tout cela fonctionne.
Malachiasz
avez-vous essayé de changer les valeurs après la rotation? je ne vois pas pourquoi cela ne devrait pas fonctionner. (si vous vous demandez comment vous pourriez connaître les valeurs précédentes de hauteur et de largeur après la rotation, vous pouvez les enregistrer dans une variable avant la rotation, puis les appliquer après la rotation.
kc ochibili
La nouvelle version de cette bibliothèque ( stackoverflow.com/a/16589629/2075875 ) fait le travail comme il se doit et fonctionne à partir d'Android 2.3 tandis que setRotation () est disponible depuis 3.0, donc je ne veux plus jouer avec la rotation, mais j'encourage vous d'essayer vous-même et de présenter le code de travail.
Malachiasz
9

Ma solution est d'utiliser simplement un ViewPagerwidget. Il n'est pas verrouillé au centre Galleryet possède des fonctionnalités intégrées pour recycler les vues (as ListView). 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 PagerAdapteret d'effectuer quelques ajustements:

public class MyPagerAdapter extends PagerAdapter {

    private Context mContext;

    public MyPagerAdapter(Context context) {
        this.mContext = context;
    }

    // As per docs, you may use views as key objects directly 
    // if they aren't too complex
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item, null);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    // Important: page takes all available width by default,
    // so let's override this method to fit 5 pages within single screen
    @Override
    public float getPageWidth(int position) {
        return 0.2f;
    }
}

En conséquence, vous aurez un widget à défilement horizontal avec adaptateur, comme ceci: entrez la description de l'image ici

fraggjkee
la source
3
il peut défiler comme ListView, mais dans le sens horizontal. La seule différence que je vois: les éléments défilent un par un, il n'est donc pas possible de faire défiler quelque part au milieu de l'élément suivant. Mais c'est ainsi que ViewPager fonctionne.
fraggjkee
8

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:

{"searchInfo":{"status":"1","message":"Success","clist":[{"id":"1de57434-795e-49ac-0ca3-5614dacecbd4","name":"Theater","image_url":"http://52.25.198.71/miisecretory/category_images/movie.png"},{"id":"62fe1c92-2192-2ebb-7e92-5614dacad69b","name":"CNG","image_url":"http://52.25.198.71/miisecretory/category_images/cng.png"},{"id":"8060094c-df4f-5290-7983-5614dad31677","name":"Wine-shop","image_url":"http://52.25.198.71/miisecretory/category_images/beer.png"},{"id":"888a90c4-a6b0-c2e2-6b3c-561788e973f6","name":"Chemist","image_url":"http://52.25.198.71/miisecretory/category_images/chemist.png"},{"id":"a39b4ec1-943f-b800-a671-561789a57871","name":"Food","image_url":"http://52.25.198.71/miisecretory/category_images/food.png"},{"id":"c644cc53-2fce-8cbe-0715-5614da9c765f","name":"College","image_url":"http://52.25.198.71/miisecretory/category_images/college.png"},{"id":"c71e8757-072b-1bf4-5b25-5614d980ef15","name":"Hospital","image_url":"http://52.25.198.71/miisecretory/category_images/hospital.png"},{"id":"db835491-d1d2-5467-a1a1-5614d9963c94","name":"Petrol-Pumps","image_url":"http://52.25.198.71/miisecretory/category_images/petrol.png"},{"id":"f13100ca-4052-c0f4-863a-5614d9631afb","name":"ATM","image_url":"http://52.25.198.71/miisecretory/category_images/atm.png"}]}}

Fichier de mise en page:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5">    
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" />
    <HorizontalScrollView
        android:id="@+id/horizontalScroll"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/ll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">    
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

fichier de classe:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        for (int v = 0; v < collectionInfo.size(); v++) {
            /*---------------Creating frame layout----------------------*/

            FrameLayout frameLayout = new FrameLayout(ActivityMap.this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, getPixelsToDP(90));
            layoutParams.rightMargin = getPixelsToDP(10);
            frameLayout.setLayoutParams(layoutParams);

            /*--------------end of frame layout----------------------------*/

            /*---------------Creating image view----------------------*/
            final ImageView imgView = new ImageView(ActivityMap.this); //create imageview dynamically
            LinearLayout.LayoutParams lpImage = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            imgView.setImageBitmap(collectionInfo.get(v).getCatImage());
            imgView.setLayoutParams(lpImage);
            // setting ID to retrieve at later time (same as its position)
            imgView.setId(v);
            imgView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // getting id which is same as its position
                    Log.i(TAG, "Clicked on " + collectionInfo.get(v.getId()).getCatName());
                    // getting selected category's data list
                    new GetSelectedCategoryData().execute(collectionInfo.get(v.getId()).getCatID());
                }
            });
            /*--------------end of image view----------------------------*/

            /*---------------Creating Text view----------------------*/
            TextView textView = new TextView(ActivityMap.this);//create textview dynamically
            textView.setText(collectionInfo.get(v).getCatName());
            FrameLayout.LayoutParams lpText = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER);
            // Note: LinearLayout.LayoutParams 's gravity was not working so I putted Framelayout as 3 paramater is gravity itself
            textView.setTextColor(Color.parseColor("#43A047"));
            textView.setLayoutParams(lpText);
            /*--------------end of Text view----------------------------*/

            //Adding views at appropriate places
            frameLayout.addView(imgView);
            frameLayout.addView(textView);
            linearLayout.addView(frameLayout);

        }

 private int getPixelsToDP(int dp) {
        float scale = getResources().getDisplayMetrics().density;
        int pixels = (int) (dp * scale + 0.5f);
        return pixels;
    }

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 ... :)

http://i.stack.imgur.com/lXrpG.png

Abdul Aziz
la source
1
J'ai édité et publié l'explication complète ici, merci pour la suggestion :)
Abdul Aziz
Bonjour merci pour votre code pouvez vous poster la méthode getPixelsToDP()?
Skizo-ozᴉʞS
@Skizo J'ai ajouté cette méthode à la fin du code java, jetez un oeil
Abdul Aziz
6

Ce n'est pas vraiment une réponse, mais que diriez-vous d'utiliser une vue de défilement horizontal ?

Faisal
la source
3
Ça marche. Mais si j'ai un grand nombre d'articles, je ne peux pas utiliser le type d'adaptateur et cliquer sur les événements.
Praveen
5

Vous pouvez utiliser RecyclerView dans la bibliothèque de support. RecyclerView est une version généralisée de ListView qui prend en charge:

  • Un gestionnaire de mise en page pour positionner les éléments
  • Animations par défaut pour les opérations d'élément courantes

Android Recycler Voir les documents

mobileideafactory.com
la source
C'est la vraie réponse à partir de cette date tardive. Mais même cela n'est pas encore prêt et est toujours en 'avant-première'
Martin
3

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 .

Neil Traft
la source
Malheureusement, votre réponse est la bonne. Même Google confirme que la seule façon de visualiser une liste horizontale est la galerie. Mais Gallery n'est pas la même chose qu'une vue de liste horizontale. Seriez-vous prêt à partager votre code? Recyclez-vous les vues?
Patrick Boos
1
Malheureusement, le code a été écrit pour mon entreprise et est donc propriétaire. Cependant, j'espère trouver du temps libre dans les mois à venir pour le réécrire (l'implémentation d'origine est assez instable) et le publier dans le domaine public. Je peux également vous dire que j'ai commencé par prendre cette démo de Sony Ericsson, en changeant tous les «x» en «y» et tous les «largeur» en «hauteur». Ensuite, j'ai supprimé les transformations 3D et ajouté un comportement d'arrêt à la fin.
Neil Traft,
@Neil Traft comment avez-vous fixé la position des objets? Et qu'en est-il de l'arrêt à la fin?
Adrian Magdas
Honnêtement, c'était vraiment beaucoup de conjectures. Il a fallu beaucoup de temps pour bien faire les choses et je suis convaincu qu'il existe une meilleure façon. Mais le principe de base est que, dans la 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.
Neil Traft
1
Si vous n'avez pas vraiment, vraiment, ABSOLUMENT besoin d'une liste horizontale, je vous encourage fortement à abandonner ou à utiliser la Galerie.
Neil Traft
3

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

Sileria
la source
Comment définir la position de défilement par programme?
Dima Portenko
La méthode setSelection () est là mais peut ne pas être implémentée à 100%. Essayez-le.
Sileria
1

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:

<HorizontalScrollView 
        android:id="@+id/photo_scroll"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scrollbars="horizontal"
        android:visibility="gone">

        <LinearLayout 
            android:id="@+id/imageview_holder"
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:layout_height="match_parent">

        </LinearLayout>
    </HorizontalScrollView>

Et cela fonctionne parfaitement bien pour moi. Dans l'activité, tout ce que je dois faire est quelque chose comme le code ci-dessous:

LinearLayout imgViewHolder = findViewById(R.id.imageview_holder);
ImageView img1 = new ImageView(getApplicationContext());
//set bitmap
//set img1 layout params
imgViewHolder.add(img1);
ImageView img2 = new ImageView(getApplicationContext());
//set bitmap
//set img2 layout params
imgViewHolder.add(img2); 

Comme je l'ai dit, cela fonctionne pour moi et j'espère que cela aidera aussi quelqu'un qui cherche à y parvenir.

Jorge Cespedes
la source
0

vous pouvez toujours créer dynamiquement vos vues de texte, etc. et définir vos écouteurs onclick comme vous le feriez avec un adaptateur

fil faible
la source
Que voulez-vous dire? je ne peux pas vous obtenir? veuillez poster un extrait de code à propos de votre idée?
Praveen
dites-moi s'il vous plaît le but de la "liste horizontale" aura-t-elle des vues complexes / multi? par exemple 2 zones de texte 1 barre de progression? ou disons simplement du texte brut? Avez-vous également un nombre fixe d'éléments dans cette vue ou vous voulez le changer dynamiquement? Répondez - moi ces derniers et je serai en mesure de vous aider avec le code
weakwire
je veux faire la galerie de texte horizontale. mais l'élément sélectionné vient au centre par défaut. Je veux être l'élément sélectionné doit être là où j'ai cliqué dessus. veuillez également consulter mes publications: stackoverflow.com/questions/3237566/text-gallery-on-android et stackoverflow.com/questions/3318617/…
Praveen
0

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.

Europa
la source
0

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 :)

tigre
la source
0

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 :

Tout d'abord, ajoutons un style indiquant l'orientation du ListView (horizontal ou vertical) dans (res / values ​​/ styles.xml):

<style name="TwoWayView">
    <item name="android:orientation">horizontal</item>
</style>

Ensuite,

Dans votre mise en page XML, utilisez le code suivant pour ajouter le TwoWayView:

<org.lucasr.twowayview.TwoWayView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lvItems"
     style="@style/TwoWayView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:drawSelectorOnTop="false"
     tools:context=".MainActivity" />

et enfin, déclarez-le et traitez-le comme n'importe quel habituel ListView:

TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);

Toutes les méthodes de ListViewfonctionneront 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éthode setChoiceModene prend pas une intvaleur mais une valeur enumappelée ChoiceMode, ce list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);sera le cas lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE.

Muhammed Refaat
la source
1
J'ai essayé - mais cela ne me permettra pas d'utiliser mon propre ArrayAdapter <PreviewImage>
DeNitE Appz
-1

Vous pouvez utiliser ViewFlipper pour inclure le XML de mise en page et ajouter des images, listview pour chaque XML de mise en page

Raju yourPepe
la source