Hola quiero crear un adaptador de cursor personalizado para que pueda mostrar una imagen con 2 líneas de texto. He tenido problemas para entender los adaptadores de cursor personalizados, pero no entiendo cómo agregar una vista de imagen para completar desde la ruta en mi base de datos.¿cómo puedo crear un adaptador de cursor personalizado para una vista de lista para usar con imágenes y texto?
Respuesta
Will,
que he hecho implementó algo increíblemente similar a lo que busca. Aquí está mi implementación.
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ItemAdapter extends CursorAdapter {
private LayoutInflater mLayoutInflater;
private Context mContext;
public ItemAdapter(Context context, Cursor c) {
super(context, c);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = mLayoutInflater.inflate(R.layout.items_row, parent, false);
return v;
}
/**
* @author will
*
* @param v
* The view in which the elements we set up here will be displayed.
*
* @param context
* The running context where this ListView adapter will be active.
*
* @param c
* The Cursor containing the query results we will display.
*/
@Override
public void bindView(View v, Context context, Cursor c) {
String title = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_TITLE));
String date = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_DATE));
String imagePath = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_IMG));
int deletion = c.getInt(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_DELETION));
int priority = c.getInt(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_PRIORITY));
/**
* Next set the title of the entry.
*/
TextView title_text = (TextView) v.findViewById(R.id.item_text);
if (title_text != null) {
title_text.setText(title);
}
/**
* Set Date
*/
TextView date_text = (TextView) v.findViewById(R.id.item_date);
if (date_text != null) {
date_text.setText(date);
}
/**
* Decide if we should display the paper clip icon denoting image attachment
*/
ImageView item_image = (ImageView) v.findViewById(R.id.item_attachment);
item_image.setVisibility(ImageView.INVISIBLE);
if (imagePath != null && imagePath.length() != 0 && item_image != null) {
item_image.setVisibility(ImageView.VISIBLE);
}
/**
* Decide if we should display the deletion indicator
*/
ImageView del_image = (ImageView) v.findViewById(R.id.item_deletion);
del_image.setVisibility(ImageView.INVISIBLE);
if (deletion == 1) {
del_image.setVisibility(ImageView.VISIBLE);
}
}
}
XML sólo en caso ...
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/list_bg">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:id="@+id/item_text"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:lines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
android:paddingLeft="2sp"
android:paddingTop="2sp"
android:textSize="18sp"
android:textStyle="bold"
android:shadowColor="#90909090"
android:shadowDx="1.0"
android:shadowDy="1.0"
android:shadowRadius="1.0"/>
<TextView android:id="@+id/item_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="#FF808080"
android:paddingLeft="2sp"
android:paddingTop="2sp"/>
</LinearLayout>
<ImageView android:id="@+id/item_deletion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/deletion"
android:visibility="invisible"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:paddingRight="5sp"/>
<ImageView android:id="@+id/item_attachment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/attachment"
android:visibility="invisible"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/item_deletion"/>
</RelativeLayout>
Esto muestra dos filas de texto y hasta 2 imágenes a la derecha del texto en función de determinadas condiciones.
¡Espero que esto pueda darte una base para trabajar!
Buena suerte:]
Aquí es un gran tutorial que he utilizado antes para ayudar con mi lista personalizada adaptadores. Parece que está haciendo exactamente lo mismo que quieres hacer. El tutorial muestra cómo construir un adaptador de lista personalizado con una imagen y dos líneas de texto.
Agregar imágenes y texto no es específico de CursorAdapter
; Usas la misma técnica para cualquier tipo de adaptador. Puede crear un diseño para su fila e inflarlo dentro de su método getView
. El proyecto de ejemplo APIDemos, que se encuentra en la carpeta Android SDK android-sdk-PLATFORM/samples/android-XY/ApiDemos
, hace lo que desea. Puede encontrar las definiciones de fila en list_item_icon_text.xml
. Aquí hay una copia del contenido del archivo (sin la licencia).
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView android:id="@+id/icon"
android:layout_width="48dip"
android:layout_height="48dip" />
<TextView android:id="@+id/text"
android:layout_gravity="center_vertical"
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content" />
</LinearLayout>
Comprobar lo que he hecho: Por cierto: CheckpointsView.getImageResId()
devuelve una referencia dibujable válida
public class CheckpointCursorAdapter extends ResourceCursorAdapter {
private int layoutType = 0;
public static final int BLOTTER = 1;
public static final int DAY = 2;
public static final int MONTH = 3;
public static final int OVERVIEW = 4;
public static final int LAYOUT_ID = R.layout.checkpoint_row;
public CheckpointCursorAdapter(Context context, int layoutType, Cursor cursor) {
super(context, LAYOUT_ID, cursor);
this.layoutType = layoutType;
}
@Override
public View newView(Context context, Cursor cur, ViewGroup parent) {
LayoutInflater li = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return li.inflate(LAYOUT_ID, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView tvListText = (TextView) view.findViewById(R.id.txtCheckPoint);
Date dt = new Date(cursor.getLong(cursor.getColumnIndex(DatabaseHelper.KEY_CHECKPOINT)));
switch (layoutType) {
case BLOTTER:
tvListText.setText(dt.toLocaleString());
((ImageView) view.findViewById(R.id.imgCheckpointInOut))
.setImageResource(CheckpointsView.getImageResId(cursor.getCount()
- cursor.getPosition()));
break;
case DAY:
tvListText.setText(new SimpleDateFormat("HH:mm:ss").format(dt));
((ImageView) view.findViewById(R.id.imgCheckpointInOut))
.setImageResource(CheckpointsView.getImageResId(cursor.getPosition() + 1));
break;
case MONTH:
tvListText.setText(new SimpleDateFormat("MMM dd HH:mm:ss").format(dt));
((ImageView) view.findViewById(R.id.imgCheckpointInOut))
.setImageResource(CheckpointsView.getImageResId(cursor.getPosition() + 1));
break;
case OVERVIEW:
break;
}
}
}
Y el XML si acaso
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/txtCheckPoint"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textSize="20dp" android:padding="8dp" android:textStyle="bold">
</TextView>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="horizontal"
android:gravity="right" android:layout_weight="1"
android:layout_marginRight="8px">
<TextView android:id="@+id/txtTotalHours"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textSize="20dp" android:padding="8dp" android:paddingRight="12dp">
</TextView>
<TextView android:id="@+id/txtHourBalanceRow"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textSize="12dp" android:padding="8dp">
</TextView>
<ImageView android:id="@+id/imgCheckpointInOut"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/black_clock" />
</LinearLayout>
Usted puede comprobar todo el código en: http://code.google.com/p/droidtimesheet/
@ todos, gracias por toda su ayuda. Lo entendí – waa1990
- 1. Implementación de una vista de lista con selección múltiple con filtro utilizando un adaptador de cursor
- 2. Creación de un adaptador de cursor simple personalizado
- 3. adaptador personalizado para gridview en android
- 4. Cómo crear y usar un IFormatProvider personalizado para DateTime?
- 5. Vista de lista y adaptadores de lista para mostrar json
- 6. ¿Cómo puedo crear un complemento adornador de imágenes personalizado para matrices numéricas en Visual Studio 2010?
- 7. ¿Cómo puedo usar un adaptador JMS para escuchar Amazon SQS
- 8. AlphabetIndexer con adaptador personalizado
- 9. onItemClickListener con adaptador personalizado y listview
- 10. ¿Vista de lista con título, imagen y texto?
- 11. Crear un UIActivityIndicatorView personalizado
- 12. MultiAutoCompleteTextView con adaptador personalizado muestra cadena ilegible
- 13. ListView con imágenes y texto
- 14. ¿Cómo puedo establecer un color de fondo diferente para cada fila en la vista de lista?
- 15. ¿Puedo crear un campo de texto personalizado y teclado para iOS sin subclasificar UIControl?
- 16. Configuración de más de un adaptador para una sola vista de lista
- 17. ¿Puedo crear un calificador de configuración personalizado para Android?
- 18. Cómo crear un cursor de mouse personalizado en Matplotlib
- 19. Usar el adaptador de matriz con más vistas en fila en la lista vista
- 20. Uso del Cursor con el adaptador ListView para una gran cantidad de datos
- 21. ¿Cómo usar un UIPickerView para múltiples campos de texto en una vista?
- 22. AlphabetIndexer con adaptador personalizado administrado por LoaderManager
- 23. Vista de lista de Android: no se pueden seleccionar varios elementos al usar un cursor
- 24. AlertDialog de opción múltiple con adaptador personalizado
- 25. ¿Puedo crear una "vista" en una lista de Python?
- 26. ¿Cómo crear un LayoutParams personalizado para usar en un diseño personalizado?
- 27. Clonar vista de texto para anexarlo a un ViewGroup
- 28. validación modelo de vista para una lista
- 29. Android cómo usar el adaptador para listView sin extender listActivity
- 30. Cómo crear un UIAlertView personalizado en la aplicación para iphone
me di cuenta de que el tutorial se enlazó es un poco anticuado ** **. Utiliza 'ArrayAdapter' en lugar de' CursorAdapter'. Además, el archivo de diseño utiliza 'LinearLayout' que puede ser reemplazado por un' RelativeLayout' para evitar un nivel de pila. El mejor diseño se menciona en el [enlace] (http://www.curious-creature.org/2009/02/22/android-layout-tricks-1/) al que el autor se refiere. Además, algunas convenciones de nomenclatura están desactualizadas, p. 'android: id =" @ + id/android: vacío "' en lugar de 'android: id =" @ android: id/empty "'. – JJD
Gracias por señalar esto, este es el problema con los tutoriales de tecnología ... no mucho de la vida útil. – jbranchaud
@JJD Usar adaptadores de matriz está perfectamente bien. Si los datos para la vista de lista tienen forma de matriz, use un adaptador de matriz. Si los datos están en forma de cursor, entonces use un adaptador de cursor. El diseño no debe ser reemplazado por linearlayout. Se debe eliminar todo junto ya que cada diseño se basa en un framelayout como punto de partida. – MobileMon