2011-02-10 10 views
9

Tengo un ListView con diseño personalizado para sus artículos y necesito especificar el color de fondo separado para los elementos marcados usando el selector. Aquí está selector para elementos extraños:Necesito ayuda con el selector de color para los artículos ListView marcados

<?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> 

y aquí está el selector de artículos incluso:

<?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> 

plantilla de elementos ListView se ve así:

<?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> 

El elemento raíz del elemento de la lista es CheckableLinearLayout: http://paste.org/pastebin/view/28711

ListView tiene un único el modo de elección (que también trató el modo de opción múltiple, pero también no funciona para mí)

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)); 
    } 
} 

En el adaptador para este ListView que llamo setChecked() de CheckableLinearLayout pero no cambia su color:

@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; 
} 

¿Qué estoy haciendo mal? Puedo ver que state_pressed elemento del selector funciona bien pero state_checked no. ¿Cuál será el enfoque correcto para configurar state_checked fondo de XML, no del código?

+0

supongo que su problema es con su adaptador. Para tales cosas, debe extender 'BaseExpandableListAdapter'. Dentro de esa clase puede sobreescribir los métodos 'getGroupView' y' getChildView', y establecer el color/tamaño/forma/etc apropiado. Mira [esta pregunta] (http://stackoverflow.com/questions/3627096/android-expandablelistviews-and-checkboxes/), donde también publiqué una implementación de adaptador de muestra. – rekaszeru

+0

Gracias por su comentario, pero lo principal que estoy tratando de lograr aquí es establecer el color de fondo en XML, no en el código. Me las arreglé para implementar esto en el código pero cuando cambio el estilo de la interfaz de usuario de mi aplicación también necesito cambiar el código. Esto es bastante inconveniente. –

+0

Consulte esta pregunta http://stackoverflow.com/questions/3742979/how-to-get-a-android-listview-item-selector-to-use-state-checked – basicsharp

Respuesta

0

Intenta implementar getListView() setOnItemClickListener como esto:.

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

¿Ha intentado crear un archivo XML que contenga la ListView similar a este? Hay algo de magia alrededor de la etiqueta @ + 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

creo que busca este atributo:

android:duplicateParentState="true" 

Trate de añadir a su etiqueta CheckableLinearLayout en su celda de disposición.

La tecla presionar/soltar es el único evento que se propaga a las vistas secundarias de un ViewGroup, por lo que cada vista administrará su propio estado a menos que explícitamente le indique que use sus padres.

Además, después de este cambio Creo que sólo puede quitar todo el bloque de código que obliga al CheckableLinearLayout a comprobar:

if(parent instanceof ListView)... 
Cuestiones relacionadas