嗨,想创建一个自定义光标适配器,以便我可以显示带有2行文本的图像。我很难理解自定义光标适配器,但我不明白如何添加数据库中的路径填充图像视图。

有帮助吗?

解决方案

将要,

实际上,我实施了与您想要的东西非常相似的东西。这是我的实施。

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

这根据某些条件显示了文本的两行文本,最多2个图像在文本的右侧。

希望这可以为您提供工作的基础!

祝你好运 :

其他提示

检查我所做的事情:顺便说一句: CheckpointsView.getImageResId() 返回有效的可绘制参考

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

}

XML以防万一

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

您可以在以下位置检查整个代码:http://code.google.com/p/droidtimesheet/

添加图像和文字不是特定于 CursorAdapter;您将相同的技术用于任何类型的适配器。您可以为您的行创建一个布局,并将其充气 getView 方法。这 apidemos 示例项目,包含在Android SDK中 android-sdk-PLATFORM/samples/android-XY/ApiDemos 文件夹,做您想做的。您可以在 list_item_icon_text.xml. 。这是文件内容的副本(带有许可证)。

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

这是一个很棒的 教程 我以前曾经用过我的自定义列表适配器。听起来好像正在做您想做的完全相同的事情。本教程显示了如何使用图像和两行文本构建自定义列表适配器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top