2011-03-14 15 views

Respuesta

32

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

0

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.

+0

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

+0

Gracias por señalar esto, este es el problema con los tutoriales de tecnología ... no mucho de la vida útil. – jbranchaud

+0

@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

1

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

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/

+0

@ todos, gracias por toda su ayuda. Lo entendí – waa1990

Cuestiones relacionadas