Poziome wyświetlanie listy w Androidzie?


215

Czy można ustawić ListViewpoziomo? Zrobiłem to za pomocą widoku galerii, ale wybrany element automatycznie pojawia się na środku ekranu. Nie chcę wybranego elementu w tym samym miejscu, w którym kliknąłem. Jak mogę rozwiązać ten problem? Moim pomysłem było ustawienie ListViewz przewijaniem poziomym. Podziel się swoim pomysłem?


1
użyj tego linku mojego postu, aby utworzyć poziomą listę Wyświetl Mam nadzieję, że ci to pomoże.
FAIZ ANWAR

2
@Indra, którego wspomniany blog został usunięty
Animesh Mangla

Możesz sprawdzić ten przykład thedeveloperworldisyours.com/android/…
Cabezas

Odpowiedzi:


123

Zgodnie z dokumentacją dla systemu Android RecyclerViewto nowy sposób organizowania elementów w widoku listy i wyświetlania w poziomie

Zalety:

  1. Ponieważ przy użyciu adaptera Recyclerview, wzorzec ViewHolder jest automatycznie wdrażany
  2. Animacja jest łatwa do wykonania
  3. Wiele innych funkcji

Więcej informacji o RecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

Próba:

survivingwithandroid.com

Wystarczy dodać poniższy blok, aby ustawić ListViewpoziomo od pionu

Fragment kodu

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);

1
Będzie to najlepsze rozwiązanie, jeśli problemy z LayoutManager zostaną naprawione przez Google. code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai

zbudować prosty widok recykler, korzystania z tego przykładu: android-examples.com/...
Matcoil

1
Ok, w jaki sposób na widżety?
Vladislav

W przeciwieństwie do innych widoków wspieranych przez adapter, takich jak ListView lub GridView, RecyclerView pozwala kodowi klienta na dostarczanie niestandardowych układów dla widoków potomnych. Te ustawienia są kontrolowane przez RecyclerView.LayoutManager. Aby RecyclerView działał, musi być zapewniony LayoutManager.
Yohanes AI

RecyclerView nadal nie jest w stanie obsłużyć kliknięć elementów (nie wspominając o klasie RecyclerView.Selection) tak dobrej i łatwej jak ListView - to jeden z niewielu powodów, dla których uważam, że RecyclerView nie jest najlepszą odpowiedzią na to pytanie.
Edward Kichot

60

Paul nie zadaje sobie trudu naprawiania błędów w swojej bibliotece ani przyjmowania poprawek użytkowników. Dlatego sugeruję inną bibliotekę, która ma podobną funkcjonalność:

https://github.com/sephiroth74/HorizontalVariableListView

Aktualizacja : 24 lipca 2013 r. Autor (sephiroth74) wydał całkowicie przepisaną wersję opartą na kodzie Androida 4.2.2 ListView. Muszę powiedzieć, że nie ma wszystkich błędów, które miała poprzednia wersja i działa świetnie!


2
To powinna być zaakceptowana odpowiedź, ponieważ ten HorizontalVariableListView jest znacznie bardziej zaawansowany niż Paul. Na przykład ma odpowiednią metodę wyboru pozycji na liście, a Paul ma na swoim miejscu „DO ZROBIENIA: zaimplementuj”.
Yan.Yurkin

5
Uwaga: to rozwiązanie wymaga Androida 2.3 lub nowszego
user1032613,

1
HorizontalVariableListView sephiroth74 jest dokładnie tym, na co masz nadzieję: Kopia ListView z kodu źródłowego Androida ze wszystkimi metodami zaktualizowanymi do poruszania się w poziomie, a nie w pionie. Nie napotkałem jeszcze żadnych problemów. Dziękuję bardzo za skierowanie mnie tam, Malachiaszu!
SilithCrowe

dobrze wrap_content do listview nadal nie jest obsługiwane w tej bibliotece
Kalpesh Lakhani

1
Jest teraz zdemontowany
Animesh Mangla,

28

@Paul answer prowadzi do świetnego rozwiązania, ale kod nie pozwala na użycie onClickListeners na elementach potomnych (funkcje zwrotne nigdy nie są wywoływane). Od jakiegoś czasu staram się znaleźć rozwiązanie i postanowiłem opublikować tutaj, co należy zmodyfikować w tym kodzie (na wypadek, gdyby ktoś tego potrzebował).

Zamiast dispatchTouchEventzastępowania zastąpienia onTouchEvent. Użyj tego samego kodu dispatchTouchEventi usuń metodę (różnicę można odczytać tutaj http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )

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

Następnie dodaj następujący kod, który podejmie decyzję o kradzieży zdarzenia z elementu potomnego przedmiotu i przekazaniu go naszemu onTouchEvent, lub pozwoleniu, aby je obsłużyli.

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

Na koniec nie zapomnij zadeklarować zmiennych w swojej klasie:

private float mInitialX;
private float mInitialY;

13
Dlaczego nie wyślesz tego do Paula jako prośby o pociągnięcie?
Cristian

ev.getActionMasked () nie jest dostępny na platformie Android 2.1. Czy wiesz jak to pokonać?
Eugene Popovich,

wydaje się, że mogę użyć int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK, które będą równe ev.getMaskedAction ()
Eugene Popovich,

Naprawdę przydatne! ale zmieniając kod na onTouchEvent mam dziwne przesunięcie. Trzymałem go w dispatchTouchEvent i działa idealnie! Dzięki
jbc25,

jbc25 i mogę potwierdzić, że wystąpią dziwne skoki, jeśli skorzystam z tej poprawki
Eugene Popovich,

23

Ponieważ Google wprowadziło Android Support Library v7 21.0.0, możesz używać RecyclerView do przewijania elementów w poziomie. Widżet RecyclerView to bardziej zaawansowana i elastyczna wersja ListView.

Aby użyć RecyclerView, po prostu dodaj zależność:

com.android.support:recyclerview-v7:23.0.1

Oto próbka:

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

Więcej informacji o RecyclerView:


21

Jest trochę (bardzo) późno, ale publikuję to na wypadek, gdyby ktoś przyszedł później.

Biblioteka pomocy technicznej w wersji zapoznawczej Androida L ma RecyclerViewdokładnie to, co chcesz.

W tej chwili możesz uzyskać to tylko za pomocą L Preview SDK i musisz ustawić minSdkna L. Ale możesz skopiować wszystkie niezbędne pliki do swojego projektu i używać ich w ten sposób, dopóki L nie zostanie oficjalnie wydany.

Dokumenty z podglądem możesz pobrać tutaj .

Ostrzeżenie: interfejs API dla Recycler View może ulec zmianie i może zawierać błędy.

Zaktualizowano

Kod źródłowy poziomego widoku listy to:

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

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

Cześć, czy to działa? ponieważ próbuję i nie mogę zrobić poziomego RecyclerView. Czy możesz podać kod? dzięki
Cocorico,

Wystarczy ustawić LinearLayoutManager- patrz tutaj: stackoverflow.com/questions/28460300/…
Stéphane

19

Pobierz plik jar stąd

teraz umieść go w folderze libs, kliknij go prawym przyciskiem myszy i wybierz „Dodaj jako bibliotekę”

teraz w main.xml umieść ten kod

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

teraz w klasie Activity, jeśli chcesz mieć poziomy widok listy z obrazkami, umieść ten kod

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

nie obsługuje żadnego selektora ani żadnego niestandardowego selektora? dowolny pomysł?
Nitin Misra

Czy mogę dodać tablicę liczb zamiast obrazów?
souravlahoti

@BeingSrv tak Możesz
Siddhpura Amit

Po umieszczeniu go w folderze libs, kliknij go prawym przyciskiem myszy i kliknij „Dodaj jako bibliotekę”
M. Usman Khan

jak do listy deweloperów Horizontallistview jak w pulsie, bbcnews proszę o pomoc
Harsha

13

To jest naprawdę bardzo proste : wystarczy obrócić widok listy, aby położyć się na boku

mlistView.setRotation(-90);

Następnie po napompowaniu dzieci powinno to znajdować się w metodzie getView. obracasz dzieci, aby powstały prosto:

 mylistViewchild.setRotation(90);

Edycja: jeśli twój ListView nie pasuje poprawnie po obrocie, umieść ListView wewnątrz tego RotateLayout w następujący sposób:

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

1
Próbowałem - nie takie proste. Nie udało mi się dopasować obróconego widoku do szerokości i wysokości ekranu. Ten interfejs API jest dostępny tylko w nowych urządzeniach.
Malachiasz

Przed obróceniem ustaw szerokość listy widoków na wysokość ekranu i ustaw wysokość widoków listy na szerokość ekranów .. (To znaczy jeśli chcesz, aby widok listy wypełniał ekran), inaczej ustaw widok listy na dowolną wysokość i szerokość przed obróceniem .
kc ochibili

1
próbowałeś tego, co mówisz? Mam i nic z tego nie działa.
Malachiasz

próbowałeś zmienić wartości po obróceniu? nie rozumiem, dlaczego to nie powinno działać. (jeśli zastanawiasz się, jak poznać poprzednie wartości wysokości i szerokości po obróceniu, możesz zapisać je w zmiennej przed obróceniem, a następnie zastosować je po obróceniu.
kc ochibili

Nowa wersja tej biblioteki ( stackoverflow.com/a/16589629/2075875 ) działa tak, jak powinna i działa w Androidzie 2.3, podczas gdy setRotation () jest dostępny od wersji 3.0, więc nie chcę ponownie grać z obracaniem, ale zachęcam spróbuj sam i zaprezentuj działający kod.
Malachiasz

9

Moim rozwiązaniem jest po prostu użycie ViewPagerwidgetu. Nie jest centralnie zablokowany jako Galleryi ma wbudowane funkcje recyklingu widoków (as ListView). Podobne podejście możesz zobaczyć w aplikacji Google Play, ilekroć masz do czynienia z listami przewijanymi poziomo.

Musisz tylko rozszerzyć PagerAdapteri wykonać kilka drobnych poprawek:

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

W rezultacie będziesz mieć poziomo przewijany widget z adapterem, taki jak ten: wprowadź opis zdjęcia tutaj


3
jest przewijalny jak ListView, ale w kierunku poziomym. Jedyna różnica, którą widzę: elementy przewijają się jeden po drugim, więc nie można przewijać gdzieś do środka następnego elementu. Ale tak działa ViewPager.
fraggjkee

8

Uwaga: Android obsługuje teraz poziome widoki listy za pomocą RecyclerView, więc teraz ta odpowiedź jest przestarzała, aby uzyskać informacje o RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView

Opracowałem logikę, aby to zrobić bez użycia zewnętrznej biblioteki poziomego przewijania, oto widok poziomy, który osiągnąłem i opublikowałem tutaj swoją odpowiedź: https://stackoverflow.com/a/33301582/5479863

Moja odpowiedź JSON jest taka:

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

Plik układu:

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

plik klasy:

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

sztuczka, która tu działa, to identyfikator, który przypisałem do ImageView „imgView.setId (v)”, a następnie zastosowanie onClickListener do tego, że ponownie pobieram identyfikator widoku .... Skomentowałem również wewnątrz kodu, więc że łatwo to zrozumieć, mam nadzieję, że to może być bardzo przydatne ... Happy Coding ... :)

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


1
Zredagowałem i opublikowałem tutaj pełne wyjaśnienie, dziękuję za sugestię :)
Abdul Aziz,

Witaj, dziękuję za kod. Czy możesz opublikować metodę getPixelsToDP()?
Skizo-ozᴉʞS,

@Skizo Dodałem tę metodę na końcu kodu Java, spójrz
Abdul Aziz


5

Możesz użyć RecyclerView w bibliotece wsparcia. RecyclerView to uogólniona wersja ListView, która obsługuje:

  • Menedżer układu do pozycjonowania elementów
  • Domyślne animacje dla typowych operacji na przedmiotach

Recykler na Androida Wyświetl dokumenty


To jest prawdziwa odpowiedź na ten późny termin. Ale nawet to nie jest jeszcze gotowe i wciąż znajduje się w „zapowiedzi”
Martin

3

Dużo szukałem rozwiązania tego problemu. Krótka odpowiedź brzmi: nie ma dobrego rozwiązania bez zastąpienia prywatnych metod i tym podobnych rzeczy. Najlepszą rzeczą, jaką znalazłem, było wdrożenie go od zera poprzez rozszerzenie AdapterView. To dość nieszczęśliwe. Zobacz moje SO pytanie dotyczące poziomych widoków list .


Niestety twoja odpowiedź jest prawidłowa. Nawet Google potwierdza, że ​​jedynym sposobem na poziomy widok listy jest Galeria. Ale Galeria to nie to samo, co poziomy widok listy. Czy byłbyś skłonny udostępnić swój kod? Czy przetwarzasz widoki?
Patrick Boos,

1
Niestety kod został napisany dla mojej firmy, dlatego jest zastrzeżony. Mam jednak nadzieję, że w najbliższych miesiącach znajdę trochę wolnego czasu, aby go przepisać (oryginalna implementacja jest dość niestabilna) i udostępnić go publicznie. Mogę również powiedzieć, że zacząłem od pobrania tej wersji demonstracyjnej od Sony Ericsson, zmieniając wszystkie „x” na „y” i całą „szerokość” na „wysokość”. Następnie usunąłem transformacje 3D i dodałem zachowanie zatrzymujące się na końcu.
Neil Traft

@Neil Traft, jak naprawiłeś pozycję przedmiotów? A co powiesz na zatrzymanie się na końcu?
Adrian Magdas

Szczerze mówiąc, to było naprawdę dużo zgadywania. Zajęło dużo czasu, aby wszystko było w porządku i jestem przekonany, że jest lepszy sposób. Ale podstawową przesłanką jest to, że w fillListDown()metodzie musisz śledzić dolną krawędź ostatniego elementu listy. Ale nie wiesz, gdzie jest ta krawędź, dopóki nie utworzysz ostatniego elementu (adapter.getCount () - 1). Poczekaj, aż ten element zostanie utworzony, a następnie możesz zapisać lokalizację krawędzi. Gdy już to wiesz, możesz upewnić się, że mListTop nigdy nie jest mniejszy niż 0 i nigdy wyższy niż wysokość listy.
Neil Traft

1
Jeśli tak naprawdę, naprawdę, absolutnie NIE potrzebujesz ABSOLUTNIE listy poziomej, MUSZĘ zachęcić cię do poddania się lub skorzystania z Galerii.
Neil Traft

3

Musiałem zrobić to samo w przypadku jednego z moich projektów i skończyło się również pisaniem własnego. Nazwałem toNazwałem HorzListView jest teraz częścią mojej otwartej biblioteki Aniqroid .

http://aniqroid.sileria.com/doc/api/ (poszukaj plików do pobrania na dole lub użyj projektu kodu Google, aby wyświetlić więcej opcji pobierania: http://code.google.com/p/aniqroid/downloads/list )

Dokumentacja zajęć znajduje się tutaj: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html


Jak programowo ustawić pozycję przewijania?
Dima Portenko

Metoda setSelection () istnieje, ale może nie być w 100% zaimplementowana. Spróbuj.
Sileria

1

Do mojej aplikacji używam HorizontalScrollView zawierającego LinearLayout wewnątrz, który ma orientację ustawioną na poziomą. Aby dodać obrazy do wewnątrz, tworzę ImageViews wewnątrz działania i dodaję je do mojego LinearLayout. Na przykład:

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

To działa dla mnie idealnie. W ćwiczeniu wszystko, co muszę zrobić, to coś w rodzaju kodu poniżej:

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

Jak powiedziałem, to działa dla mnie i mam nadzieję, że pomoże to również komuś, kto chce to osiągnąć.


0

cóż, zawsze możesz dynamicznie tworzyć swoje widoki tekstowe itp. i ustawiać onclicklisteners tak, jak zrobiłbyś to z adapterem


co masz na myśli? nie mogę cię dostać? proszę zamieścić fragment kodu swojego pomysłu?
Praveen,

proszę powiedz mi, jaki jest cel „horyzontalnego widoku listy”, czy będzie on miał złożone / wiele widoków? np. 2 pola tekstowe 1 pasek postępu? lub po prostu powiedzmy zwykły tekst? Czy masz w tym widoku stałą liczbę elementów, czy chcesz go dynamicznie zmieniać? Odpowiedz mi na te pytania, a będę w stanie pomóc Ci z kodem
osłabiony

chcę zrobić poziomą galerię tekstów. ale wybrany element jest domyślnie ustawiony na środku. Chcę być wybrany element musi być tam, gdzie go kliknąłem. proszę również sprawdzić moje posty: stackoverflow.com/questions/3237566/text-gallery-on-android i stackoverflow.com/questions/3318617/…
Praveen

0

HorizontialListView nie może działać, gdy dane w adapterze są zaangażowane w inny wątek. Wszystko działa w 100% na wątku interfejsu użytkownika. Jest to duży problem w przypadku wielowątkowości. Myślę, że przy użyciu HorizontialListView nie jest najlepszym rozwiązaniem dla problem.HorzListView jest lepszym way.You prostu zastąpić poprzednią galeria z HorzListView.You neednot zmodyfikować kod o adapter.Then wszystko idzie tak, jak hope.See https: // stackoverflow.com/a/12339708/1525777 o HorzListView.


0

Użyłem poziomego linku widoku listy w moim projekcie i uzyskałem dobre wyniki. Początkowo korzystałem z biblioteki devsmart, ale dało mi to pewne problemy. Więc najlepszy sposób na użycie poziomego linku do widoku listy, gdy udało mi się odzyskać moje problemy, a także niedawno uruchomiłem aplikację w Google PlayStore przy użyciu tej biblioteki i otrzymałem dobrą odpowiedź od użytkowników. Polecam więc korzystanie z tej samej biblioteki, o której wspomniałem powyżej, do wyświetlania widoku listy w poziomie. Cieszyć się :)


0

Jest na to świetna biblioteka, o nazwie TwoWayView , jest bardzo łatwa do wdrożenia, po prostu włącz bibliotekę projektów do swojego miejsca pracy i dodaj ją jako projekt biblioteki do oryginalnego projektu, a następnie wykonaj następujące kroki, które zostały pierwotnie wymienione tutaj :

Najpierw dodajmy styl wskazujący orientację ListView (poziomą lub pionową) w (res / values ​​/ styles.xml):

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

Następnie,

W swoim Layout XML użyj następującego kodu, aby dodać 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" />

i na koniec, po prostu to zadeklaruj i postępuj z nim jak ze zwykłym ListView:

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

Wszystkie metody ListViewbędą działać tutaj jak zwykle, ale zauważyłem tylko jedną różnicę, która polega na tym, że przy ustawianiu trybu wyboru metoda setChoiceModenie przyjmuje intwartości, ale wartość z enumwywołanej ChoiceMode, więc tak list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);będzie lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE.


1
Próbowałem tego - ale nie pozwoli mi to na użycie własnego ArrayAdapter <PreviewImage>
DeNitE Appz

-1

Możesz użyć ViewFlipper, aby dołączyć XML układu i dodać obrazy, widok listy dla każdego XML układu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.