¿Cómo configuro una imagen de fondo para cada elemento de ListView en Android?
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:padding="6dip"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="6dip" android:src="@drawable/icon" /> <LinearLayout android:orientation="vertical" android:layout_width="0dip" android:layout_weight="1" android:layout_height="fill_parent"> <TextView android:id="@+id/toptext" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_vertical" android:textStyle="bold" /> <TextView android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:id="@+id/bottomtext" android:singleLine="false" /> </LinearLayout> </LinearLayout>
Esta es mi fila actual. Si creé un .JPEG, y quiero que sea para cada elemento … ¿cómo cambiaría este archivo .xml? ¿Dónde pondría la imagen? ¿En Activos?
- ¿Cuál es eficiente en términos de memoria: char o String?
- Generar un color aleatorio Java
- Android AudioRecord artefacto
- Cordova Plugin error de la cámara en el paquete
- Problemas con MediaRecorder al iniciar la captura de vídeo en android
- ¿Cómo lanzar draw9patch y es absolutamente necesario reescalar imágenes?
- Cómo subrayar un EditText
- método "onClick" en butterknife no es un trabajo?
- ¿Cómo clonar Joda DateTime?
- Cómo configurar un spinner onClickListener () en Android
- Android permiso de creación de base de datos
- Desactivar la pantalla de rotación automática - Android
- Las filas visibles en recyclerview saltan un poco después de girar de retrato a paisaje
Si desea tener fondos individuales para cada elemento de lista, debe declarar su propio Adaptador personalizado.
Derivalo de BaseAdapter y la parte más importante a implementar es el getView(int, View, ViewGroup)
.
Debe entender cómo android vuelve a usar elementos de elementos de lista ya existentes cuando se desplaza por una lista. Esto significa: en cualquier momento en el tiempo, habrá sólo tantos puntos de vista generados como se pueden ver en pantalla simultáneamente.
Esta estrategia óptima de no generar demasiadas vistas en conjunto conduce al problema de que tendrá que establecer el fondo para cada elemento de lista de acuerdo con su posición currenty necesaria cuando getView se llama. Si intenta establecer el fondo de forma estática sólo al generar la vista, volverá a aparecer de nuevo posiblemente unido al elemento equivocado.
El método getView
trae un "convertView" como segundo parámetro o no (null). Si su método se llama con un convertidor definido en algo, que significa: "reutilizar esta vista para el elemento que se requiere ahora mismo".
La técnica utilizada aquí está muy bien descrita en las demostraciones API (sección de listas) y también hay un blog de video para eso.
He aquí cómo se puede hacer:
public class MyAdapter extends BaseAdapter { public View getView(int position, View convertView, ViewGroup parent) { // position is the element's id to use // convertView is either null -> create a new view for this element! // or not null -> re-use this given view for element! // parent is the listview all the elements are in if (convertView == null) { convertView = mInflater.inflate(R.layout.your_layout, null); // here you must do whatever is needed to populate the elements of your // list element layout ... } else { // re-use the given convert view // here you must set all the elements to the required values } // your drawable here for this element convertView.setBackground( ... ); // maybe here's more to do with the view return convertView; } }
Eso es básicamente. Si sólo hay unos cuantos dibujos de fondo que posiblemente almacenar en caché, así que no tiene que leer los recursos una y otra vez!
¡Que te diviertas!
¿Quieres una vista de lista donde cada fila tenía su propio fondo, como el de abajo?
En su código, lo más probable sería establecer un ListAdapter en la vista. Varios de los adaptadores que puede construir toman un argumento de presentación o vista. Solo tendrías que configurar la propiedad android: background para la vista a la que apuntas.
Por ejemplo, podría tener un ArrayAdapter creado de esta manera:
new ArrayAdapter<String>(context, R.layout.item, R.id.itemName);
Por supuesto, utilizo el setAdapter de ListView con este adaptador. En mi archivo item.xml , puedo definir el itemname de vista de texto como este:
<TextView android:id="@+id/itemName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Test view" android:background="@drawable/add"/>
Sin embargo, no creo que todos los tipos de ListAdapter tiene un constructor con esa característica. Compruebe la documentación para el tipo de ListAdapter que está utilizando. Si está usando uno sin este constructor, creo que puede tener que subclase el adaptador y reemplazar el getView del adaptador para inflar su vista desde su archivo XML.
Tengo la imagen add.png en cada una de las carpetas res / drawable .