2009-10-05 15 views
19

Mam wdrożony niestandardowy ListView przez rozszerzenie LinearLayout dla każdego wiersza. Każdy wiersz ma małą miniaturkę, tekst i check box. list view jest poprawnie rozmieszczony i mogę bez problemu przewijać i przeglądać.setOnItemClickListener() nie działa na niestandardowym ListView @ Android

But The ListView nie wydaje się, aby odpowiedzieć na setOnItemClickListener() na wszystkich, więc musiałem znaleźć sposób obejścia problemu poprzez ustawienie kliknij słuchacza w getView() tekstu wewnątrz każdego wiersza, który jest oczywiście tworzenie problem, gdy próbuję użyć ponownie adapter. Czy ktoś ma rozwiązanie?

Odpowiedz

43

Spróbuj
Dla ListView,

final ListView list = (ListView) findViewById(R.id.list); 
list.setItemsCanFocus(false); 

Ponadto, upewnij się, że dla CheckBox wewnątrz elementu listy ustawić aktywowana fałszywe

android:focusable="false" 
android:focusableInTouchMode="false" 
+0

Mam ten sam problem, powyższe rozwiązanie działa do wykrywania kliknięć w wierszu, ale mam 2 przyciski w moim zwyczaju ListView rzędu. Jak mogę sprawdzić, który przycisk został kliknięty? Dzięki – longhairedsi

+0

dziękuję! naprawdę mi pomogłeś !!! –

+1

@longhairedsi: proszę dodać następujący kod do metody getView() button1.setFocusable (false); button2.setFocusable (false); button1.setFocusableInTouchMode (fałsz); button2.setFocusableInTouchMode (fałsz); button1.setOnClickListener (this); button2.setOnClickListener (this); zaimplementuj odbiornik kliknięć dla przycisku w adapterze (lub w dowolnym miejscu ....) zestaw detektora kliknięcia dla widoku listy również ..... teraz sprawdź kliknięcie będzie działać zarówno dla ..... listview jak również jak w przypadku przycisków również –

0

Czy zrobiłeś ViewHolder w rozszerzonej klasie adaptera? Jeśli tak, zrób instancję tego symbolu zastępczego w komendzie setOnItemClickListener(), coś może działać w ten sposób.

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) {   
     View rowView = v; 
     if (rowView == null) { 
      LayoutInflater inflater = this.getLayoutInflater(); 
       // GET INFLATE OF YOUR LAYOUT. 
      rowView = inflater.inflate(R.layout.projectpeopledescrate, null); 
      // CUSTOM ViewHolder Class Created in Adapter. 
// name,title,comment are my components on the same listview clicked item. 
      PPDViewHolder viewHolder = new PPDViewHolder(); 
      viewHolder.name  = (TextView) rowView.findViewById(R.id.ppeopledescrvname); 
      viewHolder.title = (TextView) rowView.findViewById(R.id.ppeopledescrvtime); 
      viewHolder.comment = (TextView) rowView.findViewById(R.id.ppeoplervcomment); 
      viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
      rowView.setTag(viewHolder); 
     } 
      // ANOTHER object instance to apply new changes. 
     PPDViewHolder holder = (PPDViewHolder) rowView.getTag(); 
// I've setted up visibility over the components. You can set your onClickListener over your buttons. 
     holder.comment.setVisibility(View.GONE); 
     holder.name.setVisibility(View.GONE); 
     holder.title.setVisibility(View.GONE); 
     holder.hiddenLayout.setVisibility(View.VISIBLE); 
     holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT)); 
     holder.hiddenLayout.bringToFront(); 

    } 

Mam nadzieję, że chcesz coś takiego. Powodzenia!

11

stary odpowiedź: pisałem w previous post here

android:focusable="false" 
android:clickable="false" 

nie pomoże kiedy ImageButton jest w widoku niestandardowego .. Trzeba użyć button.setFocusable(false); podczas wykonywania (z kodu źródłowego Java)

Edytuj: Istnieje jeszcze bardziej eleganckie rozwiązanie. Spróbuj dodać android:descendantFocusability="blocksDescendants" w głównym układzie elementu listy. Że uczyni kliknięć możliwe onListItem i osobno u może obsługiwać przycisk lub ImageButton kliknie

0

Mam ten kod

this.mListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
       Log.v(TAG,"loul"); 
      } 
     }); 

Ale to nie działa

więc mam Juste umieścić onItemSelectedListener mocy i Oo praca:

this.mListView.setItemsCanFocus(false); 
this.mListView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
     Log.v(TAG,"loul"); 
    } 
}); 
//listener for nothing but it allow OnItemClickListener to work 
this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 
0

ustawić te właściwości:

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

dla wszystkich elementów interfejsu użytkownika w pliku list_item.xml.

jeśli ten nie zostanie rozwiązany w zestawie adapter:

v.imageView.setFocusable(false); 
    v.imageView.setFocusableInTouchMode(false); 
Powiązane problemy