Mam układ Androida, który ma scrollView
wiele elementów. Na dole scrollView
mam, listView
który jest następnie wypełniany przez adapter.
Problem, który mam, polega na tym, że Android wyklucza listView
zscrollView
jak scrollView
już ma funkcji przewijania-stanie. Chcę, listView
aby była tak długa, jak treść, i aby główny widok przewijania mógł być przewijany.
Jak mogę osiągnąć takie zachowanie?
Oto mój główny układ:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >
<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
I wtedy moje programowo dodać elementy do linearlayour z id: foodItemActvity_linearLayout_fragments
. Poniżej znajduje się jeden z widoków załadowanych do tego liniowego układu. To sprawia mi kłopoty ze zwojami.
<?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="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ListView
android:id="@+id/fragment_dds_review_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Mój adapter następnie wypełnia ten widok listy.
Oto obraz z przeglądarki hierarchii systemu Android, kiedy klikam główny scrollView:
Jak widać, wyklucza to widok recenzji.
Powinienem być w stanie przewinąć stronę w dół i zobaczyć 8 recenzji, ale zamiast tego pokazuje mi tylko te 3, i mogę przewinąć małą część, w której znajdują się recenzje. Chcę globalnego przewijania strony
źródło
Odpowiedzi:
Najkrótsze i najprostsze rozwiązanie dla każdego ChildView przewijać wewnątrz Scrollview . Coś takiego jak ListView, RecyclerView itp. Nie musisz robić nic specjalnego w kodzie.
Wystarczy zastąpić Scrollview z android.support.v4.widget.NestedScrollView w bieżącym pliku XML, a następnie dzieje się magia.
Poniżej znajduje się przykładowy kod xml:
Teraz możesz pozbyć się wszystkich brzydkich haków, które zrobiliśmy, aby obejść to zagnieżdżone przewijanie.
Jest czas na zabawę. Piekło Yeeeeeeeeeeeeeeeeeah!
źródło
requestLayout()
- metoda setLayoutParams już to robi.view.measure(MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
Odpowiedź jest prosta i dziwi mnie, że nie ma jeszcze odpowiedzi.
Użyj a
Header View
lub / iFooter View
na samej liście. Nie mieszajScrollView
zListView
ani czymkolwiek, co można przewijać. Ma być używany z nagłówkami i stopkami :)Zasadniczo weź całą zawartość powyżej ListView, umieść w innym pliku .xml jako układ, a następnie w kodzie napompuj ją i dodaj do listy jako widok nagłówka.
to znaczy
źródło
Wiem, że minęło tyle czasu, ale mam też ten problem, wypróbowałem to rozwiązanie i działa. Sądzę więc, że może to pomóc również innym.
Dodaję Androida: fillViewport = "true" w pliku XML układu dla scrollView. Ogólnie mój ScrollView będzie taki.
I to działa dla mnie jak magia. ListView, który znajduje się w moim ScrollView, ponownie się powiększa.
Oto pełny przykładowy kod dla ScrollView i ListView.
źródło
Tworzysz niestandardowy widok listy, którego nie można przewijać
W twoim pliku zasobów układu
W pliku Java Utwórz obiekt niestandardowego widoku listy zamiast ListView, na przykład: NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
źródło
możesz użyć tego kodu do przeglądania listy w widoku przewijania
źródło
ListView
wnętrza,RecyclerView
aby pokazać więcej niż 1. element.Możesz go rozwiązać, dodając
android:fillViewport="true"
do swojego ScrollView.przed użyciem tej właściwości widoczne było tylko jedno dziecko z mojego widoku listy. po użyciu wszystkie wiersze lub potomek listy są widoczne.
źródło
Nie rób nic w Parent ScrollView. Zrób to tylko dla potomnego ListView. Wszystko będzie działać idealnie.
źródło
Ten kod rozwiąże twój problem, jeśli zaimplementowałeś tylko ListView w kodzie.
Jeśli używasz RelativeLayout jako elementu potomnego ListView niż ten kod, zwróć tutaj wyjątek NullPointerException listItem.measure (0, 0); , z powodu RelativeLayout. Rozwiązaniem jest umieszczenie Relativelayout w LinearLayout i będzie działać dobrze.
źródło
Zostawię to tutaj na wypadek, gdyby ktoś napotkał ten sam problem. Musiałem umieścić ListView w ScrollView. ListView z nagłówkiem nie był opcją z wielu powodów. Nie było też opcji użycia LinearLayout zamiast ListView. Postępowałem zgodnie z przyjętym rozwiązaniem, ale nie zadziałało, ponieważ elementy na liście miały złożony układ z wieloma wierszami, a każdy element widoku listy miał zmienną wysokość. Wysokość została zmierzona nieprawidłowo. Rozwiązaniem było zmierzenie każdego elementu w metodzie getView () ListView Adaptera.
źródło
Możesz łatwo umieścić ListView w ScrollView! Wystarczy programowo zmienić wysokość ListView , tak jak to:
To działa idealnie!
źródło
Wykonano po wielu badaniach i rozwoju:
fragment_one.xml powinien wyglądać następująco:
Twoja klasa Java FragmentOne.java wygląda następująco:
onCreateView
źródło
Miałem podobny problem z zagadnieniem związanym z Pierwotnym plakatem - jak sprawić, by widok listy przewijał się w widoku przewijania - i ta odpowiedź rozwiązała mój problem. Wyłącz przewijanie ListView zawartego w ScrollView
Nie wywoływałem nowych fragmentów w istniejących układach ani nic takiego, tak jak robił OP, więc mój kod wyglądałby mniej więcej tak:
Zasadniczo to, co robię, to sprawdzanie długości widoku listy przed jego wywołaniem, a kiedy go nazywam, robię to na taką długość. W swojej klasie Java użyj tej funkcji:
I wywołaj funkcję w ten sposób:
Wynikiem jest widok listy bez paska przewijania, wyświetlana jest cała długość widoku listy, który przewija się wraz z paskiem przewijania widoku przewijania.
źródło
Jak już wspomnieli inni, nie używaj ListView wewnątrz ScrollView.
Aby obejść ten problem, możesz użyć LinearLayout, ale aby zachować porządek - wypełnij swój LinearLayout adapterem, tak samo jak w przypadku ListView
Możesz użyć tej klasy jako zamiennika LinearLayout, który obsługuje Adaptery
źródło
Możesz umieścić wszystko w układzie liniowym. Oznacza to, że utwórz układ liniowy, a będzie on miał 2 elementy podrzędne, widok przewijania i inny układ liniowy. Daj im wagi układu i proszę bardzo:
źródło
Nigdy nie należy używać ScrollView z ListView, ponieważ ListView dba o swoje własne przewijanie w pionie. Co najważniejsze, zrobienie tego pokonuje wszystkie ważne optymalizacje ListView do obsługi dużych list, ponieważ skutecznie zmusza ListView do wyświetlenia całej listy elementów, aby wypełnić nieskończony pojemnik dostarczony przez ScrollView.
http://developer.android.com/reference/android/widget/ScrollView.html
źródło
Moim wymaganiem jest zawarcie ListView elementów o równej wielkości w ScrollView. Wypróbowałem kilka innych wymienionych tutaj rozwiązań, żadne nie wydawało się poprawnie dopasowywać ListView (albo za mało miejsca, albo za dużo). Oto, co zadziałało dla mnie:
Mam nadzieję, że to komuś pomoże.
źródło
NIGDY nie wkładaj do
ListView
środkaScrollView
! Więcej informacji na ten temat można znaleźć w Google . W twoim przypadku użyjLinearLayout
zamiastListView
i dodaj elementy programowo.źródło
Aktualizacja
do
Chodzi o to, że próbujesz ustawić wysokość na 0dp (naprawiono)
źródło
znalazłem rozwiązanie dla scrollview -> viewpager -> FragmentPagerAdapter -> fragment -> dynamiczny widok listy, ale nie jestem autorem. jest kilka błędów, ale przynajmniej działa
układ fragmentów może być dowolny
to gdzieś po prostu
źródło
Aby użyć widoku listy w widoku przewijania, możesz wykonać następujące kroki, które działały dla mnie:
1) Utwórz plik Java NonScrollListView , który wyłącza domyślną właściwość przewijania widoku listy. a kod jest poniżej
2) Teraz stwórz plik xml, który ma
NestedScrollView
i wewnątrz tego wykorzystaniaNonScrollListView
do wyświetlania twoich przedmiotów. Spowoduje to przewinięcie całego ekranu ze wszystkimi widokami.3) Teraz w klasie java, tzn. Home.java zdefiniuj
NonScrollListView
zamiastListview
.dom klasy publicznej rozszerza Fragment {int pos = 0; ViewFlipper v_flipper;
Uwaga: użyłem
Fragments
tutaj.źródło
Ok, oto moja odpowiedź. Metoda, która naprawia wysokość ListView jest wystarczająco zamknięta, ale nie idealna. Jeśli większość przedmiotów ma tę samą wysokość, działają dobrze. Ale jeśli tak nie jest, istnieje duży problem. Próbowałem wiele razy, a kiedy wypisałem wartość listItem.getMeasureHeight i listItem.getMeasuerWidth w dzienniku, zobaczyłem, że wartości szerokości różnią się znacznie, czego się tutaj nie spodziewam, ponieważ wszystkie elementy w tym samym widoku ListView powinny mają tę samą szerokość. I tam jest błąd:
Niektóre wykorzystywały miarę (0, 0), która faktycznie uniezależniała widok, zarówno w kierunku, jak i szerokości, dziki. Niektórzy próbowali uzyskać szerokość listView, ale potem zwraca 0, bez znaczenia.
Kiedy czytam dalej, w jaki sposób Android renderuje widok, zdaję sobie sprawę, że cała ta próba nie może osiągnąć odpowiedzi, której szukałem, chyba że te funkcje działają po renderowaniu widoku.
Tym razem używam getViewTreeObserver na ListView, który chcę naprawić, a następnie dodajOnGlobalLayoutListener. Wewnątrz tej metody deklaruję nowy OnGlobalLayoutListener, w którym tym razem getWidth zwraca rzeczywistą szerokość ListView.
Pad wartości, to padding, który ustawiłem w układzie ListView.
źródło
Jeśli z jakiegoś powodu nie chcesz używać
addHeaderView
iaddFooterView
np. Gdy masz kilka list, dobrym pomysłem byłoby ponowne użycieListAdapter
do wypełnienia prostejLinearLayout
aby nie było funkcji przewijania.Jeśli masz już cały fragment
ListFragment
i chcesz go przekonwertować na podobny fragment za pomocą prostegoLinearLayout
bez przewijania (np. Aby umieścić go w ScrollView), możesz zaimplementować fragment adaptera w następujący sposób:Można też do przekazania
onCreate
,onPause
,onResume
, itd. Do oryginalnego fragmentu w zależności od potrzeb lub spróbuj dziedziczenie zamiast składzie (ale zastąpić niektóre metody tak oryginalny fragment rzeczywistości nie jest dołączony do układu hierarchii); ale chciałem jak najbardziej wyizolować oryginalny fragment, ponieważ musimy go tylko wyodrębnićListAdapter
. Jeśli zadzwonisz oryginalny fragment znajduje sięsetListAdapter
wonAttach
, to prawdopodobnie wystarczy.Oto, jak wykorzystać,
ListAsArrayFragment
aby dołączyćOriginalListFragment
bez przewijania. W działalności rodzicaonCreate
:źródło
znalazłem rozwiązanie dla scrollview -> viewpager -> FragmentPagerAdapter -> fragment -> dynamiczny widok listy, ale nie jestem autorem.
układ fragmentów może być dowolny
to gdzieś po prostu
źródło
przy użyciu tego ListView działał dla mnie
i w xml
oraz w MainActivity
Zapoznaj się z tym artykułem, aby uzyskać więcej informacji, a także wiedzieć, jak zachować widok siatki w widoku przewijania
źródło
W xml:
W Javie:
źródło
Wystarczy ustawić wartość wymaganej wysokości w atrybucie wysokości widoku listy w nadrzędnym widoku przewijania. Będzie przewijał się wraz z innymi elementami podrzędnymi rodziców.
źródło
To zadziałało dla mnie ( link1 , link2 ):
Tworzysz niestandardowy widok listy, którego nie można przewijać
W twoim pliku układu
Utwórz obiekt swojego customListview zamiast ListView jak:
źródło
Wystarczy wywołać tę funkcję po przypisaniu adaptera do widoku listy
źródło
źródło
najlepszy kod
źródło