2010-03-03 16 views
44

Szukałem wszędzie rozwiązania tego problemu, ale nie wiem, jak go wdrożyć. Mój OnItemClickListener został w jakiś sposób wyłączony w moich wierszach ListView, ponieważ mam układ ImageButton w układzie rzędów, który przejmuje fokus. Pojawiły się liczne pytania, które znalazłem, ale żaden z nich nigdzie mnie nie dostał.ListView OnItemClickListener nie odpowiada?

Sprawdziłem pytanie: this, ale nie mogłem zrobić z niego głowy ani ogona. Potrzebuję tylko sposobu, aby kliknięcia wierszy można było wykryć po naciśnięciu wiersza. Długie naciśnięcie i ostrość działają dobrze.

Odpowiedz

59

Zamiast OnItemClickListener dodaj OnClickListener do każdego ze swoich poglądów wrócił z adaptera. Będziesz musiał użyć setItemsCanFocus konfigurowania listy:

ListView list = (ListView) findViewById(R.id.myList); 
list.setAdapter(new DoubleClickAdapter(this)); 
list.setItemsCanFocus(true); 

a następnie w swoim Adapter „s getView, to przyniesie klikalny wiersz. Zakłada się, że przycisk znajduje się w napompowanym pliku XML.

+47

Nie zapomnij recyklingu widoki! Użyj convertView, za każdym razem nie dodawaj nowego. –

+0

Zasadniczo to zrobiłem, chociaż czuję, że miałem problemy z robieniem czegoś. Wypróbuję to jeszcze raz, może to tylko głupi błąd. – GuyNoir

+0

Tak, zadziałało. – GuyNoir

4

Dla mojej wersji tego problemu, problem był taki, że zaszło mój TextView obiekt do android:inputType="textMultiLine". Kiedy usunąłem tę linię, problem z listą, która nie może być klikalna, zniknął. Wygląda jak paskudny mały bug.

Ponadto, nadal mogę korzystać z właściwości android:minLines/android:maxLines bez problemu, więc nie jest to duży problem. Po prostu nie rozwiązanie, którego się spodziewałem.

+0

Utknąłem na tym przez 6 godzin i naprawdę potrzebuję pomocy. http://stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/35109304#35109304 –

+0

Dzięki greg7gkb ten pracował dla mnie !! Uratowałeś mój dzień :) – AndroidGuy

5

Jedną z możliwości zastąpienia OnClickListener dla każdego widoku NIE jest użycie numeru ImageButton - zamiast tego należy użyć . ImageView może nadal wysyłać zdarzenia do OnClickListener i nie przejmie fokusa.

51

ustawić atrybut ImageButton „s

android:focusable="false" 

ponieważ AbsListView.onTouchEvent czek child.hasFocusable().

+3

zaoszczędziłam wiele poszukiwań- dziękuję! –

+4

Działa doskonale do widoku TextView. Nie tak bardzo dla Buttons. – Ian

+0

W przypadku korzystania z Androidem: InputType dla TextView, należy ją usunąć również. –

1

Jako alternatywne rozwiązanie, które pracował dla mnie można spróbować przedłużyć swój adapter z BaseAdapter (iso wdrażanie ListAdapter Interface)

10

Przetestowałem następujące rozwiązanie na poziomie SDK 8 i 16.

W getView()

setFocusable(false); 
setClickable(false); 

zamiast ustawiając je w prawdziwe adaptera getView() robi to, co myślę, że oryginalne pytanie chciał, a to oznacza, że ​​OnItemClickListener zostaje wywołany pod warunkiem, że OnClickListener nie jest ustawiony w getView().

Zakładam, że wszystko, co możesz zrobić w widoku OnClickListener możesz zrobić równie łatwo w ListView 's OnItemClickListener. (setOnClickListener w widoku domyślnie ustawia widok, aby był klikalny, co pozornie uniemożliwia wywołanie ListView odpowiadającego OnItemClickListener.)

Zachowanie jest zgodne z oczekiwaniami, jeśli chodzi o wizualny stan ImageButton, gdy element zostanie naciśnięty lub przewrócony.

Rozwiązanie to lekkie złudzenie, ponieważ jest to element listy, który jest wciskany, nie sam ImageButton, więc jeśli przycisk nie zajmuje całego elementu listy, kliknięcie w innym miejscu elementu spowoduje, że przycisk będzie można przeciągnąć stan odzwierciedlają kliknięcie. To samo dotyczy ostrości. To może być cena warta zapłaty.

+4

Jeśli twój wiersz ListView ma wiele klikalnych elementów, prawdopodobnie możesz osiągnąć dokładnie to, czego chcesz, ustawiając 'android: descendantFocusability =" blocksDescendants "' na układzie pozycji listy najwyższego poziomu, a nie ustawiając 'OnClickListener' na widoku, który powracasz z getView(). Ustawienie 'OnClickListener's na poszczególnych elementach nadal będzie działać. – JulianSymes

+1

To rozwiązanie zadziałało również dla mnie. W moim przypadku nie otrzymałem kliknięcia zdarzenia w OnItemClickListener po kliknięciu RadioButton. – HemangNirmal

+0

Utknąłem na tym przez 6 godzin i naprawdę potrzebuję pomocy. http://stackoverflow.com/questions/35108940/why-cant--remove-an-item/35109304#35109304 –

5

najlepszym sposobem na to:

android:focusable="false" 
    android:focusableInTouchMode="false" 

ustawić te właściwości dla tego Imagebutton i spróbować. I

+0

thanx aton ........... :) – pioneerBhawna

6

To na pewno zadziała. Dodaj to do definicji layoutu.

android:descendantFocusability="blocksDescendants" 

znalazł rozwiązanie here

+0

pomógł mi, dzięki! –

0

umieścić ten kod ImageView nextpage= (ImageView)findViewById(R.id.btnEdit); zamiast ImageButton. teraz pozycja listy jest aktywna

0

Mam podkategorię ImageButton i setFocusable="false" w definicji układu nie działa dla mnie. Rozwiązał wywołanie setFocusable(false) w konstruktorze podklasy.

-1

Używanie ScrollView może zapobiec onItemClickListener od otrzymania wejście.

Mam nadzieję, że to pomoże każdemu.

1

Poniższy wiersz rozwiązać ten problem w moim projekcie:

<TextView ... android:textIsSelectable="false" /> 
0
listView= (ListView) findViewById(R.id.listview_names); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      Toast.makeText(getBaseContext(),"Clicked Button",Toast.LENGTH_LONG).show(); 
      Log.d("h","clicked"); 

      /* Intent intent=new Intent(MainActivity.this,Display_data.class); 

      intent.putExtra("NAME",n); 
      intent.putExtra("AGE",a); 
      startActivity(intent);*/ 
     } 
    }); 

Y to tost nie isn pracy

+1

Przedstawiony kod jest niejednolicie wcięty. Dlaczego zostawiłeś część tego w komentarzu? –

Powiązane problemy