Horizontale ListView in Android?

215

Ist es möglich, das ListViewhorizontal zu machen ? Ich habe dies mithilfe einer Galerieansicht getan, aber das ausgewählte Element wird automatisch in die Mitte des Bildschirms verschoben. Ich möchte das ausgewählte Element nicht an derselben Stelle haben, auf die ich geklickt habe. Wie kann ich dieses Problem beheben? Meine Idee war es, das ListViewmit einer horizontalen Schriftrolle einzustellen . Teilen Sie Ihre Idee?

Praveen
quelle
1
Verwenden Sie diesen Link meines Beitrags, um eine horizontale Listenansicht zu erstellen. Ich hoffe, es wird Ihnen helfen.
FAIZ ANWAR
2
@ Indra, dass Blog, den Sie erwähnt haben, wurde entfernt
Animesh Mangla
Sie können dieses Beispiel überprüfen thedeveloperworldisyours.com/android/…
Cabezas

Antworten:

123

RecyclerViewGemäß Android-Dokumentation ist die neue Möglichkeit, die Elemente in der Listenansicht zu organisieren und horizontal anzuzeigen

Vorteile:

  1. Da mithilfe des Recyclerview-Adapters das ViewHolder-Muster automatisch implementiert wird
  2. Animation ist einfach durchzuführen
  3. Viele weitere Funktionen

Weitere Informationen zu RecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

Stichprobe:

Überleben mit android.com

Fügen Sie einfach den folgenden Block hinzu, um ihn ListViewvon vertikal zu horizontal zu machen

Code-Auszug

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);
Devrath
quelle
1
Dies ist die beste Lösung, wenn Probleme mit LayoutManager von Google behoben werden. code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai
Verwenden Sie dieses Beispiel, um eine einfache Recycler-Ansicht zu erstellen
Matcoil
1
Ok, wie geht das mit Widgets?
Vladislav
Im Gegensatz zu anderen von Adaptern unterstützten Ansichten wie ListView oder GridView ermöglicht RecyclerView dem Client-Code, benutzerdefinierte Layoutanordnungen für untergeordnete Ansichten bereitzustellen. Diese Anordnungen werden vom RecyclerView.LayoutManager gesteuert. Damit RecyclerView funktioniert, muss ein LayoutManager bereitgestellt werden.
Yohanes AI
RecyclerView kann immer noch nicht so gut und einfach mit Klicks auf Elemente umgehen (erwähnen Sie nicht die RecyclerView.Selection-Klasse) wie ListView - dies ist einer der wenigen Gründe, warum ich denke, dass RecyclerView nicht die beste Antwort auf diese Frage ist.
Edward Quijote
60

Paul macht sich nicht die Mühe, Fehler in seiner Bibliothek zu beheben oder Benutzerkorrekturen zu akzeptieren. Deshalb schlage ich eine andere Bibliothek mit ähnlichen Funktionen vor:

https://github.com/sephiroth74/HorizontalVariableListView

Update : Am 24. Juli 2013 veröffentlichte der Autor (sephiroth74) eine komplett neu geschriebene Version basierend auf dem Code von Android 4.2.2 ListView. Ich muss sagen, dass es nicht alle Fehler hat, die die vorherige Version hatte und großartig funktioniert!

Malachiasz
quelle
2
Dies sollte eine akzeptierte Antwort sein, da diese HorizontalVariableListView viel weiter fortgeschritten ist als die von Paul. Zum Beispiel hat es eine geeignete Methode, um die Position in einer Liste auszuwählen. Pauls hat "TODO: Implementiere eines Tages" an seiner Stelle.
Yan.Yurkin
5
Beachten Sie, dass diese Lösung Android 2.3 oder höher erfordert
user1032613
1
HorizontalVariableListView von sephiroth74 ist genau das, was Sie sich erhoffen: Eine Kopie der ListView aus dem Android-Quellcode, bei der alle Methoden aktualisiert wurden, um sich horizontal und nicht vertikal zu bewegen. Ich bin noch auf keine Probleme gestoßen. Vielen Dank, dass Sie mich dorthin geleitet haben, Malachiasz!
SilithCrowe
Nun, wrap_content to listview wird in dieser Bibliothek immer noch nicht unterstützt
Kalpesh Lakhani
1
Es ist jetzt deprectaed
Animesh Mangla
28

@ Paul-Antwortlinks zu einer großartigen Lösung, aber der Code erlaubt nicht die Verwendung von onClickListeners für untergeordnete Elemente (die Rückruffunktionen werden niemals aufgerufen). Ich habe eine Weile darum gekämpft, eine Lösung zu finden, und ich habe beschlossen, hier zu posten, was Sie in diesem Code ändern müssen (falls jemand es braucht).

Anstatt dispatchTouchEventOverride zu überschreiben onTouchEvent. Verwenden Sie denselben Code dispatchTouchEventund löschen Sie die Methode (den Unterschied zwischen den beiden finden Sie hier http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers ).

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

Fügen Sie dann den folgenden Code hinzu, der entscheidet, das Ereignis von den untergeordneten Elementen zu stehlen und es unseren zu geben onTouchEvent, oder lassen Sie es von ihnen behandeln.

@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);
    }
}

Vergessen Sie nicht, die Variablen in Ihrer Klasse zu deklarieren:

private float mInitialX;
private float mInitialY;
Xavi Gil
quelle
13
Warum schickst du das nicht als Pull-Anfrage an Paul?
Cristian
ev.getActionMasked () ist auf der Android 2.1-Plattform nicht verfügbar. Wissen Sie, wie Sie dies überwinden können?
Eugene Popovich
scheint, dass ich int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK verwenden kann, die gleich ev.getMaskedAction () sein sollten
Eugene Popovich
Wirklich nützlich! Aber wenn ich Code in onTouchEvent ändere, bekomme ich einen seltsamen Offset. Ich habe es in dispatchTouchEvent behalten und es funktioniert perfekt! Danke
jbc25
jbc25 Ich kann bestätigen, dass seltsame Sprünge auftreten, wenn dieses Update verwendet werden soll
Eugene Popovich
23

Seit Google die Android Support Library v7 21.0.0 eingeführt hat, können Sie mit RecyclerView Elemente horizontal scrollen. Das RecyclerView-Widget ist eine erweiterte und flexiblere Version von ListView.

Um RecyclerView zu verwenden, fügen Sie einfach die Abhängigkeit hinzu:

com.android.support:recyclerview-v7:23.0.1

Hier ist ein Beispiel:

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);
    }
}

Weitere Informationen zu RecyclerView:

klimat
quelle
21

Dies ist etwas (sehr) spät, aber ich poste dies, falls jemand später dazu kommt.

Die Support-Bibliothek ab der Android L-Vorschau RecyclerViewbietet genau das, was Sie wollen.

Gerade jetzt, können Sie es nur durch die L Vorschau SDK erhalten und Sie müssen Ihre einstellen minSdkzu L. Sie können jedoch alle erforderlichen Dateien in Ihr Projekt kopieren und auf diese Weise verwenden, bis L offiziell veröffentlicht ist.

Sie können die Vorschaudokumente hier herunterladen .

Warnung: Die API für Recycler View kann sich ändern und es können Fehler auftreten.

Aktualisiert

Der Quellcode für die horizontale Listenansicht lautet:

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

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);
Abhay Buch
quelle
Hallo, funktioniert es? weil ich es versuche und keine horizontale RecyclerView erstellen kann. Können Sie einen Code eingeben? danke
Cocorico
Stellen Sie einfach die LinearLayoutManager- siehe hier: stackoverflow.com/questions/28460300/…
Stéphane
19

Laden Sie die JAR-Datei hier herunter

Legen Sie es nun in Ihrem libs-Ordner ab, klicken Sie mit der rechten Maustaste darauf und wählen Sie "Als Bibliothek hinzufügen".

Jetzt in main.xml diesen Code einfügen

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

Wenn Sie jetzt in der Aktivitätsklasse eine horizontale Listenansicht mit Bildern wünschen, geben Sie diesen Code ein

  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
quelle
Es unterstützt keinen Selektor oder einen benutzerdefinierten Selektor? irgendeine Idee?
Nitin Misra
Kann ich anstelle von Bildern eine Reihe von Zahlen hinzufügen?
Souravlahoti
@ BeingSrv ja Sie können
Siddhpura Amit
Nachdem Sie es in den libs-Ordner gelegt haben, klicken Sie mit der rechten Maustaste darauf und klicken Sie auf "Als Bibliothek hinzufügen"
M. Usman Khan
Wie Entwickler Liste von Horizontallistview wie in Puls, bbcnews bitte helfen Sie mir
Harsha
13

Es ist eigentlich sehr einfach : Drehen Sie einfach die Listenansicht, um sich auf die Seite zu legen

mlistView.setRotation(-90);

Nach dem Aufblasen der Kinder sollte sich diese in der getView-Methode befinden. Sie drehen die Kinder, um aufrecht zu stehen:

 mylistViewchild.setRotation(90);

Bearbeiten: Wenn Ihre ListView nach dem Drehen nicht richtig passt, platzieren Sie die ListView wie folgt in diesem RotateLayout :

 <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
quelle
1
Ich habe es versucht - nicht so einfach. Es ist mir nicht gelungen, die gedrehte Ansicht an die Bildschirmbreite und -höhe anzupassen. Und diese API ist nur in neuen Geräten verfügbar.
Malachiasz
Stellen Sie vor dem Drehen die Breite der Listenansichten auf die Bildschirmhöhe und die Höhe der Listenansichten auf die Bildschirmbreite ein. (Wenn die Listenansicht den Bildschirm ausfüllen soll.) Andernfalls stellen Sie die Listenansicht auf die gewünschte Höhe und Breite ein, bevor Sie sie drehen .
kc ochibili
1
Hast du versucht, was du sagst? Ich habe und nichts davon funktioniert.
Malachiasz
Haben Sie versucht, die Werte nach dem Drehen zu ändern? Ich verstehe nicht, warum es nicht funktionieren sollte. (Wenn Sie sich fragen, woher Sie die vorherigen Werte für Höhe und Breite nach dem Drehen kennen, können Sie sie vor dem Drehen in einer Variablen speichern und nach dem Drehen anwenden.
kc ochibili
Die neue Version dieser Bibliothek ( stackoverflow.com/a/16589629/2075875 ) erledigt den Job wie es sollte und funktioniert unter Android 2.3, während setRotation () seit 3.0 verfügbar ist. Ich möchte also nicht noch einmal mit Rotate spielen, aber ich ermutige Sie können es selbst versuchen und Arbeitscode präsentieren.
Malachiasz
9

Meine Lösung besteht darin, einfach ein ViewPagerWidget zu verwenden. Es ist nicht zentriert wie Galleryund verfügt über integrierte Funktionen zum Recycling von Ansichten (als ListView). Möglicherweise sehen Sie in der Google Play-App einen ähnlichen Ansatz, wenn Sie mit horizontal scrollbaren Listen arbeiten.

Sie müssen dort nur PagerAdapterein paar Optimierungen vornehmen:

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;
    }
}

Als Ergebnis haben Sie ein horizontal scrollbares Widget mit Adapter wie folgt: Geben Sie hier die Bildbeschreibung ein

fraggjkee
quelle
3
Es kann wie ListView gescrollt werden, jedoch in horizontaler Richtung. Der einzige Unterschied, den ich sehe: Elemente werden einzeln gescrollt, sodass es nicht möglich ist, irgendwo in die Mitte des nächsten Elements zu scrollen. Aber so funktioniert ViewPager.
fraggjkee
8

Hinweis: Android unterstützt jetzt horizontale Listenansichten mit RecyclerView. Daher ist diese Antwort für Informationen zu RecyclerView veraltet: https://developer.android.com/reference/android/support/v7/widget/RecyclerView

Ich habe eine Logik entwickelt, um dies ohne Verwendung einer externen Bibliothek für horizontale Bildlaufansichten zu tun. Hier ist die horizontale Ansicht, die ich erzielt habe, und ich habe meine Antwort hier veröffentlicht: https://stackoverflow.com/a/33301582/5479863

Meine json Antwort lautet:

{"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"}]}}

Layoutdatei:

    <?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>

Klassendatei:

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;
    }

Trick, der hier funktioniert, ist die ID, die ich ImageView "imgView.setId (v)" zugewiesen habe, und nachdem ich onClickListener darauf angewendet habe, rufe ich wieder die ID der Ansicht ab .... Ich habe dies auch im Code kommentiert dass es leicht zu verstehen ist, hoffe ich, dass dies sehr nützlich sein kann ... Happy Coding ... :)

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

Abdul Aziz
quelle
1
Ich habe die vollständige Erklärung hier bearbeitet und veröffentlicht, danke für den Vorschlag :)
Abdul Aziz
Hallo danke für deinen Code kannst du die Methode posten getPixelsToDP()?
Skizo-ozᴉʞS
@ Skizo Ich habe diese Methode am Ende des Java-Codes hinzugefügt, schauen Sie mal
Abdul Aziz
6

Dies ist keine gute Antwort, aber wie wäre es mit einer horizontalen Bildlaufansicht ?

Faisal
quelle
3
Es klappt. Aber wenn ich eine große Anzahl von Elementen habe, kann ich den Adapter nicht verwenden und auf Ereignisse klicken.
Praveen
versuchen Sie diese indrapatel.blogspot.in/2013/10/…
Indra
5

Sie können RecyclerView in der Support-Bibliothek verwenden. RecyclerView ist eine verallgemeinerte Version von ListView, die Folgendes unterstützt:

  • Ein Layout-Manager zum Positionieren von Elementen
  • Standardanimationen für allgemeine Elementoperationen

Android Recycler Anzeigen von Dokumenten

mobileideafactory.com
quelle
Dies ist die eigentliche Antwort zu diesem späten Zeitpunkt. Aber auch das ist noch nicht fertig und befindet sich noch in der 'Vorschau'
Martin
3

Ich habe viel nach einer Lösung für dieses Problem gesucht. Die kurze Antwort lautet: Es gibt keine gute Lösung, ohne die privaten Methoden und dergleichen außer Kraft zu setzen. Das Beste, was ich gefunden habe, war, es durch Erweiterung von Grund auf selbst zu implementieren AdapterView. Es ist ziemlich elend. Siehe meine SO-Frage zu horizontalen ListViews .

Neil Traft
quelle
Leider ist Ihre Antwort die richtige. Sogar Google bestätigt, dass der einzige Weg für die horizontale Listenansicht die Galerie ist. Galerie ist jedoch nicht dasselbe wie eine horizontale Listenansicht. Wären Sie bereit, Ihren Code zu teilen? Recyceln Sie Ansichten?
Patrick Boos
1
Leider wurde der Code für meine Firma geschrieben und ist daher proprietär. Ich hoffe jedoch, in den kommenden Monaten etwas Zeit zu haben, um es neu zu schreiben (die ursprüngliche Implementierung ist ziemlich instabil) und es öffentlich zugänglich zu machen. Ich kann Ihnen auch sagen, dass ich diese Demo von Sony Ericsson übernommen habe und alle 'x' in 'y' und alle 'width' in 'height' geändert habe. Dann habe ich die 3D-Transformationen entfernt und das Verhalten beim Anhalten am Ende hinzugefügt.
Neil Traft
@Neil Traft Wie haben Sie die Position der Artikel festgelegt? Und was ist mit einem Stopp am Ende?
Adrian Magdas
Ehrlich gesagt war es wirklich nur eine Menge Rätselraten. Es hat lange gedauert, bis es richtig lief, und ich bin überzeugt, dass es einen besseren Weg gibt. Die Grundvoraussetzung ist jedoch, dass Sie bei der fillListDown()Methode den unteren Rand des letzten Listenelements verfolgen müssen. Sie wissen jedoch erst, wo sich diese Kante befindet, wenn Sie das letzte Element (adapter.getCount () - 1) erstellen. Sie warten also, bis das Element erstellt wurde, und können dann die Position der Kante speichern. Sobald Sie das wissen, können Sie sicherstellen, dass mListTop niemals kleiner als 0 und niemals größer als die Höhe der Liste ist.
Neil Traft
1
Wenn Sie nicht wirklich, wirklich, ABSOLUT eine horizontale Liste benötigen, würde ich Sie DRINGEND ermutigen, aufzugeben oder die Galerie zu nutzen.
Neil Traft
3

Ich musste dasselbe für eines meiner Projekte tun und schrieb schließlich auch mein eigenes. Ich nannte es HorzListView ist jetzt Teil meiner Open-Source- Aniqroid- Bibliothek.

http://aniqroid.sileria.com/doc/api/ (Suchen Sie unten nach Downloads oder verwenden Sie das Google Code-Projekt, um weitere Download-Optionen anzuzeigen : http://code.google.com/p/aniqroid/downloads/list )

Die Klassendokumentation finden Sie hier: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html

Sileria
quelle
Wie kann ich die Bildlaufposition programmgesteuert einstellen?
Dima Portenko
Die Methode setSelection () ist vorhanden, kann jedoch nicht zu 100% implementiert werden. Versuch es.
Sileria
1

Für meine Anwendung verwende ich eine HorizontalScrollView, die LinearLayout enthält und deren Ausrichtung auf horizontal eingestellt ist. Um Bilder hinzuzufügen, erstelle ich ImageViews innerhalb der Aktivität und füge sie meinem LinearLayout hinzu. Beispielsweise:

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

Und das funktioniert perfekt für mich. In der Aktivität muss ich nur so etwas wie den folgenden Code tun:

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

Wie gesagt, das funktioniert bei mir und ich hoffe, es hilft jemandem, der dies auch erreichen möchte.

Jorge Cespedes
quelle
0

Nun, Sie können Ihre Textansichten usw. immer dynamisch erstellen und Ihre Onclicklistener so einstellen, wie Sie es mit einem Adapter tun würden

schwacher Draht
quelle
Was meinst du? Ich kann dich nicht bekommen? Bitte Postleitzahl über Ihre Idee posten?
Praveen
Bitte teilen Sie mir den Zweck der "horizontalen Listenansicht" mit. Wird sie komplexe / mehrere Ansichten haben? zB 2 Textfelder 1 Fortschrittsbalken? Oder sagen wir einfach Klartext. Haben Sie auch eine feste Anzahl von Elementen in dieser Ansicht oder möchten Sie diese dynamisch ändern? Antworte mir diese und ich werde dir mit Code helfen können
schwacher Draht
Ich möchte die horizontale Textgalerie machen. Das ausgewählte Element wird jedoch standardmäßig in die Mitte gestellt. Ich möchte das ausgewählte Element sein, muss dort sein, wo ich darauf geklickt habe. Bitte überprüfen Sie auch meine Beiträge: stackoverflow.com/questions/3237566/text-gallery-on-android und stackoverflow.com/questions/3318617/…
Praveen
0

HorizontialListView kann nicht funktionieren, wenn die Daten im Adapter in einem anderen Thread enthalten sind. Alles läuft zu 100% auf dem UI-Thread. Dies ist ein großes Problem bei Multithread. Ich denke, die Verwendung von HorizontialListView ist nicht die beste Lösung für Ihr Problem. HorzListView ist ein besserer Weg. Sie ersetzen einfach Ihre vorherige Galerie durch HorzListView. Sie müssen den Code für den Adapter nicht ändern. Dann läuft alles so, wie Sie es sich erhoffen. Siehe https: // stackoverflow.com/a/12339708/1525777 über HorzListView.

Europa
quelle
0

Ich hatte in meinem Projekt einen horizontalen Listenansichtslink verwendet und gute Ergebnisse erzielt. Ich hatte anfangs die Devsmart- Bibliothek benutzt, aber es gab mir einige Probleme. Der beste Weg, um den horizontalen Listenansichtslink zu verwenden, da er meine Probleme behoben hat. Außerdem habe ich kürzlich meine App im Google PlayStore mit dieser Bibliothek gestartet und von den Nutzern eine nette Antwort erhalten. Ich empfehle Ihnen daher, dieselbe Bibliothek zu verwenden, die ich oben erwähnt habe, um die Listenansicht horizontal anzuzeigen. Genießen :)

Tiger
quelle
0

Dafür gibt es eine großartige Bibliothek namens TwoWayView , die sehr einfach zu implementieren ist. Fügen Sie einfach die Projektbibliothek in Ihren Arbeitsbereich ein und fügen Sie sie als Bibliotheksprojekt zu Ihrem ursprünglichen Projekt hinzu . Führen Sie dann die folgenden Schritte aus, die ursprünglich hier erwähnt wurden :

Fügen wir zunächst einen Stil hinzu, der die Ausrichtung der ListView (horizontal oder vertikal) in (res / values ​​/ styles.xml) angibt:

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

Dann,

Verwenden Sie in Ihrem Layout-XML den folgenden Code, um TwoWayView hinzuzufügen:

<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" />

und zum Schluss deklarieren Sie es einfach und behandeln Sie es wie jeden normalen ListView:

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

Alle Methoden ListViewwerden hier wie gewohnt arbeiten, aber es gibt nur einen Unterschied , den ich bemerkt, das ist , wenn die Wahl - Modus einstellen, wobei das Verfahren setChoiceModekein nimmt intWert , sondern einen Wert aus enumaufgerufen ChoiceMode, so list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);wird lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE.

Muhammed Refaat
quelle
1
Ich habe es versucht - aber es erlaubt mir nicht, meinen eigenen ArrayAdapter <PreviewImage> zu verwenden
DeNitE Appz
-1

Sie können ViewFlipper verwenden, um das Layout-XML einzuschließen und Bilder hinzuzufügen, Listenansicht für jedes Layout-XML

Raju yourPepe
quelle