2016-03-31 8 views
0

Ich arbeite an der benutzerdefinierten Listview mit BaseAdapter. Ich habe ein kleines Problem nach dem Tippen auf ListView Element, dass bestimmte Zeile wird hervorgehoben, aber danach, wenn ich ein anderes Listenelement tippen wird es hervorgehoben, aber immer noch das ältere bleibt es gleich, es geht nicht in den vorherigen Zustand.Wie listview ein Elementelement auswählen?

Ich möchte sehen, dass ein Element auf einmal auswählen sollte.

enter image description here

MainActivity.java

if (musicRealmResults.get(currentIndex).isSelected() == false) { 
    musicRealmResults.get(currentIndex).setIsSelected(true); 

    playSong(currentIndex, true); 

    adapter.notifyDataSetChanged(); 
} else { 
    musicRealmResults.get(currentIndex).setIsSelected(false); 
    adapter.notifyDataSetChanged(); 
} 

MusicAdapter.java

if (musicRealmResults.get(position).isSelected()) { 

    Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/fonts_bold.otf"); 
    holder1.albumsTextView.setTypeface(tf); 

    holder1.equalizerView.setVisibility(View.VISIBLE); 
    holder1.albumsImageView.setVisibility(View.INVISIBLE); 
    holder1.equalizerView.animateBars(); 
} else { 
    Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/fonts_regular.otf"); 
    holder1.albumsTextView.setTypeface(tf); 

    holder1.equalizerView.setVisibility(View.GONE); 
    holder1.albumsImageView.setVisibility(View.VISIBLE); 
    holder1.equalizerView.stopBars(); 
} 

Bitte freundlich meine Post gehen und machen Sie mir, wie wählen Sie tun und in einer Listview Zeile deaktivieren.

+0

In Ihrem OnItemClickListener von listview. Setzen Sie den Booleschen Wert (isSelected) der bestimmten Position auf wahr und setzen Sie false zurück. und notifyDataSetChanged. Dann in Ihrem Adapter getview(), nach dieser Flagge ändern, Farbe und Schriftart etc. –

Antwort

0

Sie können dies in Ihrem model class verwalten. Machen Sie einfach einen Toggle Boolean isSelected mit seiner getter and setter, wenn Benutzer tippen auf Listenelement überprüfen, ob es bereits ausgewählt ist oder nicht, wenn nicht, dann markieren Sie es als ausgewählt und aktualisieren Sie den Booleschen Wert in Ihrer Modellklasse.

mListLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(list.get(position).getisSelected()){ 
        // list item is already selected. 
        mListLayout.setBackgroundColor(Color.WHITE); // normal color 
        list.get(position).setisSelected(false); 
       } 
       else{ 
        // list item is not selected, make it selected 
        mListLayout.setBackgroundColor(Color.GRAY); // selected color 
        list.get(position).setisSelected(true); 
       } 
       notifyDataSetChanged(); 
      } 
     }); 
+0

hey danke feines Problem gelöst – animation123

1

Scheint, dass Sie setSelected(false) Ihren vorherigen Artikel nicht konnten. Bitte überprüfen Sie setChoiceMode() von ListView oder Sie können nur Ihren vorherigen Artikel auf setSelected(false) zurücksetzen.

+0

hey danke können Sie mir sagen, wie man in OnItemClickListener zu tun? – animation123

+0

Wenn 'setChoiceMode()' nicht für Sie funktioniert, können Sie currentSelectedIndex/position in 'onItemClick' verfolgen und dann den vorherigen selectedIndex in 'onItemClick()' auf false setzen. – ekouChiq

+0

hey vielen Dank, dass es so ist funktioniert gut – animation123

1

Wiederholen Sie alle Array-Elemente, setzen Sie den Status auf "false" und setzen Sie currentIndex auf "true".

MainActivity

for(int i =0 ; i < musicRealmResults.size() ; ++i){ 
    musicRealmResults.get(i).setIsSelected(false); 
} 

musicRealmResults.get(currentIndex).setIsSelected(true); 

playSong(currentIndex, true); 

adapter.notifyDataSetChanged(); 
+0

hey danke ich glaube nicht, es ist eine gute Idee, wenn die Größe der Arraylist ist mehr als die UI wird langsam. – animation123

+0

Ja, es funktioniert, aber die Reaktionszeit ist langsam. – animation123

+0

Wie viele Artikel hast du? –

0

Versuchen Below-Code:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      if (musicRealmResults.get(position).isSelected() == false) 
      { 
       musicRealmResults.get(position).setIsSelected(true); 

       playSong(position, true); 

       adapter.notifyDataSetChanged(); 
      } 
      else 
      { 
       musicRealmResults.get(position).setIsSelected(false); 
       adapter.notifyDataSetChanged(); 
      } 

     } 
    }); 
+0

hey danke Kumpel aber das gleiche habe ich auch getan, aber es funktioniert nicht ??? – animation123

1

Dies ist eine gute Alternative zu, wenn u eine Schleife durch den Rest der Positionen sie abzuwählen nicht wollen.

int prevSelection =-1; //nothing selected 

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (prevSelection==-1) //nothing selected 
        { 
         musicRealmResults.get(position).setIsSelected(true); 
         adapter.notifyDataSetChanged(); 
         prevSelection = position; 
        }else if (prevSelection == position) //deselect previously selected 
        { 
        musicRealmResults.get(position).setIsSelected(false); 
        adapter.notifyDataSetChanged(); 
        prevSelection = -1; 
       }else // Some other selection 
        { 
        musicRealmResults.get(prevSelection).setIsSelected(false); 
        musicRealmResults.get(position).setIsSelected(true); 
        adapter.notifyDataSetChanged(); 
        prevSelection = position; 
} 
+0

@D Agrawal hey danke, aber ich bekomme diese Ausnahme "java.lang.ArrayIndexOutOfBoundsException: rowIndex ist kleiner als 0.", musicRealmResults.get (prevSelection).setIsSelected (false); in dieser Zeile – animation123

+0

int prevSelection = -1 sollte über ur onCreate(); mit anderen möglichen Deklarationen. Und auch meine erste Fehlerbedingung sollte if sein (prevSelection == -1). Ich werde aktualisiert. –

+0

hey bro danke es funktioniert gut, es ist eine gute Logik – animation123

Verwandte Themen