2013-08-08 7 views
5

Ich habe eine Listview mit benutzerdefinierten XML Listitems bevölkert, ist dies die XML ist:Android Listview-Highlight nicht, wenn ein OnClickListener gesetzt

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="?android:attr/listPreferredItemHeight" 
       android:padding="6dip"> 
... 
</RelativeLayout> 

Listenansicht zeigt korrekt auf dem Bildschirm, und wenn ich auf ein Element klicken oder halten es wird blau (ich bin mit Holo-Licht Theme)

das Problem kommt, wenn ich versuche, eine OnClickListener der Ansicht zuweisen, innerhalb getView in meiner Tätigkeit, die BaseAdapter erweitert:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
... 
} 

Danach wird die Hervorhebungsfarbe des Listenelements nicht mehr angezeigt, wenn ich auf ein Listenelement klicke oder halte, bleibt der Hintergrund weiß, trotzdem funktioniert der onClickListener einwandfrei.

Haben Sie Vorschläge, die Highlight-Farbe zu erhalten, während Sie die Standardstile von HoloLight beibehalten?

Antwort

3

Möglicherweise möchten Sie OnItemClickListener auf dem ListView selbst verwenden, anstatt separate Listener für Elementansichten zu klicken.

Auch hat Highlight Problem bereits hier beschrieben: Android listview no longer highlights selection onclick

+0

Person, die downvoted, sich kümmern, um zu kommentieren, was mit meiner Antwort falsch ist? So kommen wir der Wahrheit näher. –

+0

ich nicht, jedenfalls war ich neugierig auf OnItemClickListener, meinst du, dass dies mein Problem lösen wird? Gibt es Leistungsprobleme bei der Verwendung von OnClickListener? - Ich habe diese Frage bereits gelesen, aber die Lösung verwendet nicht den HoloLight-Stil, den ich brauche. –

+0

Nun, wenn Ihre Artikel ähnlich sind, können Sie einen Listener verwenden und nach Artikel-ID unterscheiden - ein Objekt statt möglicherweise Hunderte. Wie für holo - Sie können Holo mit der Lösung aus dieser Antwort verwenden, verwenden Sie die Hervorhebung Hintergrund heißt R.drawable.list_selector_holo_dark –

0

Fügen Sie diese in das Layout-Attribute für das übergeordnete RelativeLayout:

android:addStatesFromChildren="true" 

Alternativ in Coderuf:

convertView.setAddStatesFromChildren(true); 

Stellen Sie in beiden Fällen sicher, dass die untergeordneten Layouts das Attribut android:duplicateParentState nicht festgelegt haben (und rufen Sie nicht setDuplicateParentState(true) auf) Sie erhalten zur Laufzeit eine Ausnahme.

+0

Das ist nicht Für mich funktioniert der XML-Teil. Der programmatische Teil kann ich nicht testen, weil der Compiler sich über die Methode setAddStatesFromChildren "Does not exist" beschwert. Wie auch immer, warum sollte es funktionieren? –

0

können Sie behalten die Markierung Verhalten und haben mehrere OnClickListener, wenn Sie

  1. die OnClickListener gesetzt
  2. deaktivieren Sie die OnClickListener
  3. Aufruf der OnClickListener von einem OnItemClickListener.

so zu tun, fügen Sie setClickable(false), um Ihren Code:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
    // make non-clickable again, like before setting the OnClickListener 
    convertView.setClickable(false); 
    ... 
} 

und rufen programmatisch den Hörer, zum Beispiel:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
{ 
    final View view = inflater.inflate(R.layout.fragment_with_listview, container, false); 
    final ListView your_listview = (ListView) view.findViewById(R.id.your_listview); 
    // delegate to specific callbacks 
    your_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { view.callOnClick(); 
     } 
    }); 
    ... 
} 

Hinweis das dokumentierte Verhalten von callOnClick():

Rufen Sie direkt einen angehängten OnClickListener auf. Im Gegensatz zu performClick() ruft dies nur den Listener auf und führt keine zugeordneten Klickaktionen wie das Melden eines Accessibility-Ereignisses aus.

Verwandte Themen