Comment puis-je créer un adaptateur de curseur personnalisé pour une listview pour une utilisation avec des images et des textes?

StackOverflow https://stackoverflow.com/questions/5300787

Question

Salut veulent créer un adaptateur de curseur personnalisé afin que je puisse afficher une image avec 2 lignes de texte. J'ai eu du mal à comprendre les adaptateurs curseur sur mesure, mais je ne comprends pas comment ajouter un imageview à remplir à partir du chemin dans ma base de données.

Était-ce utile?

La solution

Will,

Je l'ai effectivement mis en œuvre quelque chose d'incroyablement similaire à ce que vous recherchez. Voici ma mise en œuvre.

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 ... juste Incase

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

Cette affiche deux lignes de texte et jusqu'à 2 images à droite du texte en fonction de certaines conditions.

J'espère que cela peut vous donner une base de travail!

Bonne chance:]

Autres conseils

Vérifiez ce que je l'ai fait: BTW: CheckpointsView.getImageResId() renvoie une référence drawable valide

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

}

Et le XML juste au cas

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

Vous pouvez vérifier le code entier à: http://code.google.com/p/droidtimesheet/

Ajout d'images et du texte ne sont pas spécifiques à CursorAdapter; vous utilisez la même technique pour tout type d'adaptateur. Vous pouvez créer une mise en page pour votre ligne et le gonfler à l'intérieur de votre méthode de getView. APIDemos exemple de projet, contenu dans le dossier Android SDK android-sdk-PLATFORM/samples/android-XY/ApiDemos, fait ce que vous voulez. Vous pouvez trouver les DEFINITIONS de ligne dans list_item_icon_text.xml. Voici une copie du contenu du fichier (w / o la licence).

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

Voici un tutoriel que je ont utilisé avant pour aider avec mes adaptateurs liste personnalisée. On dirait qu'il fait exactement la même chose que vous voulez faire. Le tutoriel montre comment construire un adaptateur de liste personnalisée avec une image et deux lignes de texte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top