使用simplecursoradapater从listview文件中显示图像

时间:2012-12-30 04:49:24

标签: android sqlite imageview simplecursoradapter

我想要做的是使用SimpleCursorAdapter在我的drawable-dbimages文件夹中显示图像。

我真的不知道如何去做这件事。我知道如何使用BitmapFactory.decodeResource在数据库中按名称获取图像,但我不知道如何将其应用于适配器。

例如,假设我有一个名为cars的表。在该表中,我有一个名为image的列。每行image的值是drawable-dbimages文件夹中图像的名称。

现在我有了这段代码:

cursor = datasource.fetchAllCars();
to = new int[] { R.id.listitem_car_name, R.id.listitem_car_image };
dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_car, cursor, columns, to, 0);
setListAdapter(dataAdapter);

其中R.id.listitem_car_name是文本视图,R.id.listitem_car_image是图像视图。

我知道如何从数据库中获取image的值并将其吐出到textview中,但是我想让它从drawables文件夹中获取图像,其名称在数据库列中,显示在每个listview项目的imageview中。

我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

android的预制SimpleCursorAdapter构建仅支持TextViews并将光标列映射到它们。对于你所描述的内容,你需要制作自己的适配器对象,这里我使用了CursorAdapter,这需要在幕后工作中弄脏你的手。这是我的示例中的主要实例:

    cursor = datasource.fetchAllCars();
    dataAdapter = new CustomCursorAdapter(this, cursor, 0);
    setListAdapter(dataAdapter);

然后是完整的对象

import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomCursorAdapter extends CursorAdapter {

    private LayoutInflater inflater;

    public CustomCursorAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View newView(Context context, Cursor c, ViewGroup parent) {
        // do the layout inflation here
        View v = inflater.inflate(R.layout.listitem_car, parent, false);
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c) {
        // do everything else here
        TextView txt = (TextView) v.findViewById(R.id.listitem_car_name);
        ImageView img = (ImageView) v.findViewById(R.id.listitem_car_image);

        String text = c.getString(c.getColumnIndex("COLUMN_TEXT")); 
        txt.setText(text);

        // where the magic happens
        String imgName = c.getString(c.getColumnIndex("COLUMN_IMAGE"));
        int image = context.getResources().getIdentifier(imgName, "drawable", context.getPackageName());
        img.setImageResource(image);
    }

}

我希望它主要是不言自明的,但我标记为“魔法发生的地方”的部分应该是与你的问题有关的最重要的部分。基本上,你从数据库中获取图像名称,下一行尝试按名称查找图像(而不是像往常一样通过id),然后你就像平常一样设置图像。对于无法找到的图像,该方法返回int 0,因此您可能希望也可能不想为此执行错误处理。此外,如果你想使用其他方法加载你的图像,那就是这样做的。