2017-04-18 18 views
11

Mam Listview z EditTexts w każdej komórce. Ilekroć dodaję tekst do punktu, w którym EditText rośnie 1 linia, ListView przewija się do góry (i zazwyczaj usuwa EditText z widoku).ListView Przewiń do góry, gdy EditText Rośnie

Znalazłem kilka pytań na ten temat, ale wydają się one mieć tylko "hacki" jako odpowiedzi i nic, co działa dla mnie.

ListView scrolls to top when typing in multi-line EditText

Listview with edittext - auto scroll on "next"

EDIT: Po wielu badań, odkryłem, że to dlatego, że EditText jest zmiana rozmiaru, powodując układ ListView jego subviews a następnie zresetowanie do góry. Chcę znaleźć sposób, aby EditText mógł się rozwijać, pozostając w tym samym miejscu.

Próbowałem tego powodu sugestii znalazłem w Internecie, ale mimo to utrzymuje ListView na odpowiedniej wysokości, to kasuje ostrość od EditText i nie wydaje się uzyskać go z powrotem requestFocus.

private Stirng getTextWatcher(){ 
return new TextWatcher(){ 
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
@Override public void onTextChanged(CharSequence s, int start, int before, int count) { } 
@Override public void afterTextChanged(Editable s) { 
listView.setSelection(index); 
    } 
} 
} 

Więc jakie byłyby potrzebne jest:

  1. mają sposób dla ListView aby nie przejść automatycznie do góry, gdy subviews są rozplanowane ponownie lub

  2. sposób na skupienie się napo wywołaniu ListView.setSelected() lub 3. Mam inny sposób przewijania ListView, który nie usunie fokusu z EditText.

Dla opcji

  1. Próbowałem scrollTo() i smoothScrollToPosition(). scrollTo z jakiegoś powodu działa, ale ukrywa pewne elementy od ListView (stają się niewidoczne, niezaładowane). I smoothScrollToPosition() tworzy animację, w której ListView przeskakuje na górę, a następnie przenosi użytkownika z powrotem do Przedmiotu (i robi to 2 lub 3 razy).
+0

można pisać kod? Dlaczego te odpowiedzi nie działają dla Ciebie? – legendof

+0

@legendof opublikować mój kod na co? widok listy? Wydaje mi się to dość standardowe. Nic specjalnego. Nie robię nic w tym java oprócz wypełnienia go, tylko w XML. Chodziło mi o to, że wszystkie są hackami i chcę czegoś eleganckiego i wydajnego ... nie tak jak "przewijaj listę za każdym razem, gdy dodawana jest litera" – NickProvost

+0

Czy możesz pokazać nam układ XML? Kod listy, podobnie jak jej rodzice. Czy to jest przypadkiem w ScrollView? –

Odpowiedz

4

Jak par moim zdaniem, jeśli chcesz wziąć wejście od ListView pozycji za pomocą EditText należy użyć TextView w miejscu EdiText i przez kliknięcie TextView należy otworzyć i wejścia Dialog z EditText, który jest bardziej proste i dobre rozwiązanie . Obsługa EditText focus w ListView jest trudna i trzeba do tego dodać dodatkową Listeners.

LUB

A jeśli masz ograniczoną liczbę polu wprowadzania w swoim UI/UX następnie można wdrożyć EditText z CustomListView za pomocą ScrollViews.

+0

Właśnie przetestowałem twoją metodę. Drugi działał bezbłędnie dla mnie. To, co zrobiłem, to użycie układu liniowego wewnątrz widoku przewijania i wstawienie moich widoków programowo w języku Java. Działa wspaniale, a widok przewijania pozostaje na swoim miejscu, gdy editekst rośnie. Dziękuję Ci. – NickProvost

0

ListView Przewijanie do góry Kiedy EditText Rośnie

ListView ma kilka znanych ograniczeń związanych z dziecięcą ostrości.

Rozwiązanie

Dlaczego nie spróbować użyć RecyclerView zamiast ListView? Firma Google wprowadziła RecyclerView jako domyślny zalecany sposób takiego interfejsu. Więc niestandardowe ListView lub hacki nie są już potrzebne.

0

Można spróbować dodać ten atrybut do ListView:

android:transcriptMode="normal" 

To sprawia, że ​​lista automatycznie przewinąć do dołu po otrzymaniu powiadomienia o zmianach zbiór danych i tylko wtedy, gdy ostatnia pozycja jest już widoczny na ekranie .

Czytaj więcej tutaj: attr_android:transcriptMode | Android Developers

+0

Próbowałem tego. Zdecydowanie nie działa – NickProvost

Powiązane problemy