13

Tengo una vista de lista que muestra varios elementos. Ahora quiero desplazarme a un elemento específico (por ejemplo, el 33º elemento). Sé que esto se puede hacer a través deEstablecer un color de fondo para un elemento de ListView seleccionado en android

myList.setSelection(32); 

Pero en la interfaz de usuario de la opción no recibe ninguna resaltado (porque está en modo táctil ?!). ¿Cómo puedo aplicar un color de fondo específico para este artículo? Intenté

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red); 

pero obtengo una NullPointerException porque getSelectedView() devuelve nulo. ¿Hay alguna manera de lograr este resaltado? Tengo que notificar al usuario de alguna manera sobre qué elemento es el "activo" ...

Respuesta

0

Probablemente la forma más fácil es utilizar un List List State para su fondo. Esto le permite aplicar diferentes estilos dependiendo de si el control en cuestión está seleccionado/enfocado/deshabilitado/etc.

Para una introducción a los Listones Estatales, consulte this article.

0

Cambie la línea

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red); 

a

myList.getSelectedView().setBackgroundColor(getResources().getColor(Color.RED)); 
+1

sigo teniendo una NullPointerException. Puede intentarlo usted mismo ampliando listview-tutorial: http://developer.android.com/resources/tutorials/views/hello-listview.html – codie4711

1

Probé por la siguiente manera y resolvió el problema.

Creó una clase javaBean que recibe la posición. Como siguiendo.

public class Global { 

    public static int mListPosition = 0; 

    public static int getListPosition() { 
     return mListPosition; 
    } 

    public static void setListPosition(int mListPosition) { 
     Global.mListPosition = mListPosition; 
    } 
} 

entonces de la OnListItemClickListener() I establecer la posición del elemento seleccionado. Como siguiente

mList.setOnItemClickListener(new OnItemClickListener() { 

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     Global.setListPosition(arg2);     
    } 
}); 

Luego, en la clase de adaptador haga lo siguiente

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) mCtx 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.details_retailer_list_row, null); 

     mHolder = new ViewHolder(); 
     v.setTag(mHolder); 

     mHolder.mDetailsRetailerLayout = (LinearLayout) v 
       .findViewById(R.id.details_cart_retailer_row_layout); 
     mHolder.mDetailsRetailer = (TextView) v 
       .findViewById(R.id.detailsRetailerRow); 

    } else { 
     mHolder = (ViewHolder) v.getTag(); 
    } 

    final CartDetailsRetailerBean mDetailsRetailerBean = mItems 
      .get(position); 
    if (position == Global.getListPosition()) { 
     mHolder.mDetailsRetailerLayout 
       .setBackgroundResource(R.drawable.image1); 
    } else { 
     mHolder.mDetailsRetailerLayout 
       .setBackgroundResource(R.drawable.image2); 
    } 

    if (mDetailsRetailerBean != null) { 
     Log.i("Global Position", "" + Global.getListPosition()); 
     mHolder.mDetailsRetailer.setText(mDetailsRetailerBean 
       .getRetailerName()); 
    } 
    return v; 
}  

Prueba con esto para cambiar el color de fila seleccionada cambio de fondo en la vista Lista de Android.

2
  1. Para resaltar el elemento seleccionado, debe solicitar el enfoque para listView y ejecutar setSelection() en el hilo de la interfaz de usuario. Esto funcionó para mí:
runOnUiThread(new Runnable() { 
    public void run() { 
     myList.requestFocus(); 
     myList.setSelection(position); 
    } 
}); 

2.To aplicar un color específico a un elemento. Puede usar listItem personalizado.

a. Establecer lisItem personalizado para su Listview:

ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.customizedlistitem,arrListView); 
myList.setAdapter(listAdapter); 

b. En su carpeta de diseño, cree customizedlistitem.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/customizedlistitem" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/customizedbackground"/> 

c. En su carpeta dibujable, cree un fondo personalizado.xml así:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/RED"></item> 
    <item android:state_pressed="true" android:drawable="@color/GREEN"></item>  
    <item android:drawable="@color/BLACK"></item> <!-- for other state -->   
</selector> 

d. Asegúrese de que el color rojo, verde y NEGRO se definió en su proyecto (se puede definir en color.xml en la carpeta valores):

<?xml version="1.0" encoding="utf-8"?> 

<resources> 
    <color name="RED">#FF0000</color> 
    <color name="GREEN">#008000</color> 
    <color name="BLACK">#000000</color> 
</resources> 
0

El nullPointerException es probable que estés en touchmode, en realidad no setSelection selecciona el elemento en la lista Vista cuando estás en modo táctil, simplemente "mira", si sabes a qué me refiero.

que tienes que hacer un adaptador personalizado (mediante la creación de una clase que extiende el adaptador que está utilizando actualmente:])

Y en su clase de adaptador personalizado es necesario sustituir los getView (int posición, Ver convertView, ViewGroup método de los padres), así:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
     convertView = inflater.inflate(android.R.layout.simple_list_item_1, null); 
    String content = lista.get(position).toString(); 
    TextView text = (TextView) convertView.findViewById(android.R.id.text1); 
    text.setText(content); 
    convertView.setBackgroundColor(lista.get(position).getBackgroundColor()); 
    return convertView; 
} 

en el código, la variable "lista" es una lista de algunos artículos que tengo a mi adaptador.

Así que, cuando haya terminado de seleccionar el tema, tienes que llamar a la getView para cada elemento que tiene, o puede llamar a los métodos de invalidateViews su Listview antes se establece la selección (si se llama invalidateViews después de la la selección, se tendrá en cuenta la selección (al menos en touchmode:]))

2

probar esto, se trabajo-

myList.getChildAt(myList.getSelectedItemPosition()).setBackgroundColor(Color.RED); 
1

ListView en el archivo xml:

<ListView android:id="@+id/android:list" android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/Tablayoutdesign" 
     android:cacheColorHint="#000000" 
     android:dividerHeight="1dip" 
     android:layout_marginTop="63dip" 
     android:layout_marginBottom="40dip" 

     /> 

crear nuevas XML con el nombre listselector como:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <!-- Selected --> 
    <item 
    android:state_focused="true" 
    android:state_selected="false" 
    android:drawable="@drawable/focused"/> 

    <!-- Pressed --> 
    <item 
    android:state_selected="true" 
    android:state_focused="false" 
    android:drawable="@drawable/selected" /> 

</selector> 

crear el archivo colors.xml como:

<resources> 
    <drawable name="focused">#ff5500</drawable> 
    <drawable name="selected">#FF00FF</drawable> 
</resources> 

En su código java:

ListView lv= (ListView) findViewById(R.id.list); 
lv.setSelector(R.drawable.listselector); 
Cuestiones relacionadas