Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Establecer un color de fondo en un elemento ListView seleccionado en android

Tengo una lista que muestra varios elementos. Ahora quiero desplazarme a algún elemento específico (por ejemplo, el elemento 33). Sé que esto se puede hacer a través de

myList.setSelection(32); 

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

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

Pero consigo una excepción de NullPointerException porque getSelectedView () devuelve null. ¿Hay alguna manera de lograr este resaltado? Tengo que notificar al usuario de alguna manera sobre qué elemento es el "activo" uno …

  • Android: Cómo obtener la posición del texto desde el evento táctil
  • Android - obtener la selección de texto de EditText
  • Selección de Android Spinner
  • Obtener la aplicación seleccionada de Intent.createChooser
  • Detección de cambios de selección en WebView
  • Cómo obtener la selección de usuario de startActivityForResult (Intent.createChooser (fileIntent, "Abrir archivo utilizando ..."), APP_PICKED) ;?
  • Cómo obtener texto y valor seleccionados Android ListPreference
  • ¿Qué es el modo de selección de selección modal?
  • 7 Solutions collect form web for “Establecer un color de fondo en un elemento ListView seleccionado en android”

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

    2.Para aplicar un color específico a un artículo. Puede utilizar listItem personalizado.

    a. Establezca lisItem personalizado para su listView:

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

    segundo. 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"/> 

    do. En su carpeta dibujable, cree customizedbackground.xml como esto:

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

    re. Asegúrese de que el color ROJO, VERDE y NEGRO estaba definido en su proyecto (puede definirlo en color.xml en la carpeta de 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> 

    Pruebe esto, funcionará-

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

    Intenté por la manera siguiente y solucioné 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; } } 

    Luego de OnListItemClickListener() establezco la posición del elemento seleccionado. Como seguir

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

    A continuación, en la clase del 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; } 

    Intente esto para cambiar el cambio de color de fondo de fila seleccionado en la vista de lista de Android.

    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" /> 

    Cree un nuevo xml con el nombre del selector de listas 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 tu código java:

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

    Probablemente la forma más fácil es usar una Lista de Estado Drawable para su fondo. Esto le permite aplicar estilos diferentes dependiendo de si el control en cuestión está seleccionado / enfocado / deshabilitado / etc.

    Para una introducción a la Lista de Estado de dibujos, echa un vistazo a este artículo .

    Cambiar la línea

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

    a

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

    El nullPointerException es probablemente porque estás en touchmode, setSelection realmente no selecciona el elemento en el listView cuando estás en modo de contacto, sólo "mira" en él, si sabes lo que quiero decir.

    Tienes que hacer un adaptador personalizado (creando una clase que extienda el adaptador que usas actualmente:])

    Y en su clase de adaptador personalizado debe reemplazar el método getView (int position, View convertView, ViewGroup parent), como esto:

     @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 elementos que tengo en mi adaptador.

    Por lo tanto, cuando haya terminado de seleccionar su elemento, debe llamar al getView para cada elemento que tenga, o puede llamar al método invalidateViews de su listaVista antes de establecer la selección (si llama a invalidateViews después de la selección, la selección será Ignorado (al menos en touchmode:]))

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.