9

Ich habe das gleiche Problem ein paar Mal gepostet, aber es wurde noch nicht gelöst. Ich habe eine ListFragment und ich möchte das ausgewählte Element in der Liste hervorheben. Ich habe Vorschläge bekommen, einen "Selektor" zu benutzen. Ich verstehe nicht, wie man diesen Selektor benutzt. Meine ListFragment Klasse ist:Ausgewähltes Element in "ListFragment" hervorheben?

// Create an adapter with list of stores and populate the list with 
     // values 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, StoreList); 
     setListAdapter(adapter); 
     mDbHelper.close(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * Handles the event when an item is clicked on left pane, performs action 
    * based on the selection in left pane 
    * 
    * @see android.app.ListFragment#onListItemClick(android.widget.ListView, 
    * android.view.View, int, long) 
    */ 
    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     String selectedStore = (String) getListAdapter().getItem(position); 
     DetailFragment fragment = (DetailFragment) getFragmentManager() 
       .findFragmentById(R.id.detailFragment); 
     if (fragment != null && fragment.isInLayout()) { 
      v.setBackgroundColor(getResources().getColor(R.color.BLUE)); 
      // passes selectedStore to detail fragment 
      fragment.setText(selectedStore); 

      // getItemList(selectedStore); 

     } 

Mit setBackground die Farbe dauerhaft einstellt, aber ich mag es weg, wenn ein anderes Element ausgewählt wird. Ich verstehe, wie man einen Selektor in einem ListView verwendet, aber in meinem Fall, wenn ich keine xml für die Listview definiert habe, wie würde ich dann einen "Selektor" verwenden? Ich verwende android.R.layout.simple_list_item_1, die vordefiniert ist.

+1

Das Konzept der "Auswahl" in Android für eine "ListView" ist für die Verwendung mit D-Pads, Trackballs, Pfeiltasten und anderen Zeigegeräten. Auf Tablets gibt es ein verwandtes Konzept einer "aktivierten" Zeile, das dazu bestimmt ist, das zuletzt angetippte Element von dem Touchscreen hervorzuheben, um einen Kontext für etwas benachbart zu ihm bereitzustellen (z. B. Hauptdetailmuster). – CommonsWare

Antwort

4

Ich habe nicht bekommen, was ich wollte, also habe ich weiter gegraben und eine "billige" Lösung entwickelt, die vielleicht nicht die beste Praxis ist, aber ihre Aufgabe erfüllt. Ich wollte das Element markiert werden, wenn ausgewählt und die Farbe sollte weggehen, wenn ein anderes Element aus dem listFragment ausgewählt wird. Dies ist, was für me- gearbeitet definiert ich eine statische View V; und initialisiert es V = new View(getActivity()); dann in meinem

onListItemClick (Listview-l, Ansicht v, int Position, long id)

  V.setBackgroundResource(0); 
      v.setBackgroundResource(R.color.BLUE); 
      V = v; 
+2

Macht es vielleicht sogar schlechte Praxis anstatt "nicht die beste Praxis"; Speichern einer Ansicht, die einen Verweis auf die Aktivität enthält, in einem statischen Objekt. Dadurch leckt die Aktivität. – NickL

+3

Sie werden ein Problem haben, wenn die Liste größer als der Bildschirm wird. Da die gleiche Ansicht für zuvor ausgeblendete Elemente wiederverwendet wird, wenn sie angezeigt werden, können einige von ihnen als "ausgewählt" angezeigt werden. – Stefan

+0

@Stefan Ich habe dieses Problem. Weißt du, wie das zu beheben ist? http://stackoverflow.com/questions/31442067/list-item-wont-stay-selected-despite-setting-necessary-properties – MacaronLover

6

Von Ihrer ListView, rufen Sie setChoiceMode(ListView.CHOICE_MODE_SINGLE). Wenn Sie dann einen ausgewählten Eintrag markieren möchten, rufen Sie setItemChecked(index, true).

+4

Dies funktioniert nicht, wenn Sie einen benutzerdefinierten Adapter mit einem benutzerdefinierten Layout für Listenelemente verwenden. – Mehmed

4

Ich habe das gleiche versucht und ich habe keine gute Lösung gefunden. Was ich eigentlich tun diesen Code wird mit dem Hörer einzustellen:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     list_adapter.setSelectedPosition(position); 
     listView.invalidate(); 
    } 
}); 

, wo die Liste Adapter die folgenden öffentlichen Methoden

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false); 
    if(position == selected_pos){ 
     rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color))); 
    } 
    return rowView; 
} 

public void setSelectedPosition(int selected_pos){ 
    this.selected_pos = selected_pos; 
} 

public int getSelectedPosition(){ 
    return selected_pos; 
} 

, das definiert ist, ändere ich den Hintergrund des Listenelement programmatisch. Und auch auf den Blinkeffekt zu vermeiden, wenn das Listenelement klicken Ich sehe keine Wähler für den gedrückten Zustand

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" 
     android:drawable="@drawable/list_item_focused_color" /> 
    <item android:drawable="@drawable/list_item_default_color" /> 
</selector> 

Das wie beabsichtigt funktioniert für mich. Ich habe keine bessere Lösung gefunden, da setSelected (true) auf Listenelementen nicht funktioniert!

+0

Es sieht gut aus, wird es ausprobieren und Sie wissen lassen, was ich gefunden habe. –

7

Die folgende für mich gearbeitet:

res/Farbe/menu_highlight.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
    android:state_pressed="true" 
    android:drawable="@color/red" /> 
    <item 
    android:state_selected="true" 
    android:drawable="@color/red" /> 
    <item 
    android:drawable="@color/white" /> 
</selector> 

res/Werte/Colors.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<color name="white">#FFFFFF</color> 
<color name="red">#FF0000</color> 
</resources> 

res/layout/menuitem.xml :: (XML für jedes Element in der Liste)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent"> 
    <TextView 
     android:id="@+id/textmenu" 
     android:layout_height="wrap_content" 
     android:text="text" 
     android:textColor="#FFFFFF" 
     android:background="@color/menu_highlight" 
     android:visibility="visible" 
     android:layout_width="fill_parent" /> 
</LinearLayout> 

Schließlich Fügen Sie in der ListFragment-Klasse View previous hinzu und fügen Sie der Onlistitemclick-Funktion den folgenden Code hinzu.(Erwähnt in ListFragment: highlight selected row)

public class MenuListFragment extends ListFragment{ 

View previous; 

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     //Logic to highlight selected item 
     previous.setSelected(false); 
     v.setSelected(true); 
     previous=v; 
    } 

}  
+0

Das klingt, als würde es unter dem gleichen Problem leiden, das Stefan auf der angenommenen Antwort erwähnte: Sie werden haben ein Problem, wenn die Liste größer als der Bildschirm wird. Da die gleiche Ansicht für zuvor ausgeblendete Elemente wiederverwendet wird, wenn sie angezeigt werden, können einige von ihnen als "ausgewählt" angezeigt werden. –

0

i Code

getListView().setItemChecked(0, true); 

nach

setListAdapter(oAdapter); 

Codeblock

0

Etwas Ähnliches zu a1pha geben, aber mit den Wählern, wenn Sie das haben view können Sie view.setSelected (true) und das würde den Stil, den Sie für y definiert haben, hinzufügen unser Selektor. Sie müssen das Flag entfernen, sobald die Aktion ausgeführt wird.

3

Das funktionierte sehr gut für mich in der ListFragment, aber ich denke, es funktioniert nur für Android 4.0 und höher. Ich habe ein einfaches Layout für das Listenelement mit android:background="?android:attr/activatedBackgroundIndicator (im Fall von Android unter 4,0 Sie die ähnlichen in Drawables ceate benötigen):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:gravity="center_vertical" 
android:background="?android:attr/activatedBackgroundIndicator" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/list_item_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:singleLine="true" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:layout_margin="@dimen/double_view_margin" /> 

Und dann erstellen Sie einfach ein einfaches ArrayAdapter dies mit Layout und stellen Sie die Wahl-Modus zu einzelnen:

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); 

setListAdapter(labelsAdapter); 

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Danach können Sie das notwendige Element mit setItemChecked Methode hightlight kann:

@Override 
public void onListItemClick(final ListView l, final View v, final int position, final long id) { 
    getListView().setItemChecked(position, true); 
} 
+0

Wenn Sie 'onListItemClick' nicht überschreiben, wird das' ListFragment' dieses Element automatisch als aktiviert markieren. Oder rufen Sie einfach 'super.onListItemClick (...)' auf. – Gautam

Verwandte Themen