2011-02-10 9 views
9

Ho un ListView con layout personalizzato per i suoi articoli e ho bisogno di specificare il colore di sfondo separato per gli elementi selezionati usando il selettore. Ecco selettore per oggetti strani:Serve aiuto con il selettore dei colori per gli elementi ListView verificati

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

e qui è il selettore per gli elementi anche:

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

modello di elemento ListView si presenta così:

<?xml version="1.0" encoding="utf-8"?> 
<com.androidhub.core.CheckableLinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="40dip"> 
    <TextView 
     android:text="TextView" 
     android:id="@+id/textView1" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:gravity="center_vertical" 
     android:textColor="@color/list_item"></TextView> 
</com.androidhub.core.CheckableLinearLayout> 

L'elemento principale della voce di elenco è CheckableLinearLayout: http://paste.org/pastebin/view/28711

ListView ha singolo la modalità scelta (ho anche provato la modalità scelta multipla, ma anche non funziona per me)

public class MainActivity extends ListActivity { 

    List<String> items = new ArrayList<String>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     items.add("test 1"); 
     items.add("test 2"); 
     items.add("test 3"); 
     items.add("test 4"); 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     getListView().setAdapter(new TestAdapter(this, items)); 
     getListView().setBackgroundColor(getResources(). 
      getColor(android.R.color.white)); 
    } 
} 

In adattatore per questo ListView io chiamo setChecked() di CheckableLinearLayout, ma non cambia il suo colore:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    View v = convertView; 
    if(v == null) { 
     v = inflater.inflate(R.layout.list_item, null); 
    } 

    if(position % 2 != 0) { 
     v.setBackgroundResource(R.drawable.list_item_even); 
    } 
    else { 
     v.setBackgroundResource(R.drawable.list_item_odd); 
    } 

    if(parent instanceof ListView) { 
     ListView lv = (ListView)parent; 
     if(v instanceof CheckableLinearLayout) { 
      CheckableLinearLayout cll = (CheckableLinearLayout)v; 
      cll.setChecked(lv.isItemChecked(position)); 
     } 
    } 

    return v; 
} 

Cosa sto facendo male? Posso vedere che stato_pressed elemento da selettore funziona bene ma stato_checked no. Quale sarà l'approccio giusto per configurare lo sfondo con stato da XML, non dal codice?

+0

Credo che il problema è con il vostro adattatore. Per tali cose dovresti estendere 'BaseExpandableListAdapter'. All'interno di questa classe è possibile sovrascrivere i metodi 'getGroupView' e' getChildView' e impostare il colore/dimensione/forma/ecc. Appropriati. Dai un'occhiata a [questa domanda] (http://stackoverflow.com/questions/3627096/android-expandablelistviews-and-checkboxes/), dove ho pubblicato anche un'implementazione di adattatore di esempio. – rekaszeru

+0

Grazie per il tuo commento ma la cosa principale che sto cercando di ottenere qui è impostare il colore di sfondo in XML, non nel codice. Sono riuscito a implementare questo codice in codice, ma quando cambio lo stile dell'interfaccia utente della mia app ho bisogno di cambiare anche il codice. Questo è abbastanza scomodo. –

+0

Vedere questa domanda http://stackoverflow.com/questions/3742979/how-to-get-a-android-listview-item-selector-to-use-state-checked – basicsharp

risposta

0

Prova attuazione getListView() setOnItemClickListener in questo modo:.

OnItemClickListener listener = new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 

     CheckableLinearLayout r; 
     for(int i = 0; i< lv.getChildCount(); i++) { 
      r= (CheckableLinearLayout)lv.getChildAt(i); 
      if(i==position) 
       r.setChecked(true); 
      else 
       r.setChecked(false); 
     } 

    } 
}; 
0

Avete provato a generare un XML per tenere il vostro ListView simile a questo? C'è un po 'di magia attorno al tag @ + id/android: list.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/megaphone_320x480"> 
     <ListView 
       android:id="@+id/android:list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:background="@drawable/megaphone_320x480" 
       android:cacheColorHint="@drawable/transparent" 
       /> 
     <TextView 
       android:id="@id/android:empty" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:textColor="@drawable/red" 
       android:gravity="center_vertical|center_horizontal" 
       android:textStyle="bold" 
       android:text="@string/error_no_groups" 
       /> 
</LinearLayout> 
2

Penso che si sta cercando per questo attributo:

android:duplicateParentState="true" 

Prova ad aggiungere al vostro tag CheckableLinearLayout nel layout delle cellule.

Il tasto stampa/rilascio è l'unico evento che viene propagato alle viste secondarie di un ViewGroup, quindi ogni vista gestirà il proprio stato a meno che non gli dica esplicitamente di utilizzarlo come genitore ".

Inoltre, dopo questo cambiamento penso che si può semplicemente rimuovere l'intero blocco di codice che costringe il CheckableLinearLayout da controllare:

if(parent instanceof ListView)... 
Problemi correlati