xamarin android ListView with image

本文关键字:image with ListView android xamarin | 更新日期: 2023-09-27 17:55:47

我从数据库加载数据并显示在列表视图上。列表视图包含 2 个文本视图和 1 个图像视图。我正在使用 SQlite.net。我的数据库在哪里:

数据库

public class contacts
{
    [PrimaryKey, AutoIncrementAttribute, Column("id")]
    public int id {get; set;}
    public string name {get; set;}
    public string number { get; set; }
    public byte[] photo{ get; set; }
}

我填充列表视图的函数在哪里:

private void refreshListView()
    {           
        var db = new SQLiteConnection (MainActivity._DatabaseConnectString);
        MatrixCursor mMatrixCursor = new MatrixCursor (new String[]{ "_id", "name", "number", "photo" });
        SimpleCursorAdapter adap;
        adap = new SimpleCursorAdapter (
            this,
            Resource.Layout.lv_layout,
            null,
            new String[]{ "name", "number", "photo" },
            new int[]{ Resource.Id.tv_name, Resource.Id.tv_number, Resource.Id.iv_photo }, 0);
        IEnumerable<contacts> table = db.Query<contacts> ("select * from contacts");
        foreach (var contact in table) {
            mMatrixCursor.AddRow (new Java.Lang.Object[] {contact.id,
                contact.name, contact.number, BitmapFactory.DecodeByteArray (contact.photo, 0, contact.photo.Length)
            });
        }
        lview.Adapter = adap;
        adap.SwapCursor (mMatrixCursor);
    }

唯一的问题是图像没有显示,并且输出中出现了此错误:

[BitmapFactory] Unable to decode stream: java.io.FileNotFoundException: /android.graphics.Bitmap@42087da0: open failed: ENOENT (No such file or directory)
[System.out] resolveUri failed on bad bitmap uri: android.graphics.Bitmap@42087da0

我已经使用 java for android 完成了这个应用程序,我用这段代码解决了这个问题,但我不知道如何将代码从 java "翻译"到 c#。

adap 下方的 java 代码在哪里:

adap.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int i) {
            if (view.getId() == R.id.iv_photo) {
                byte[] Blobdata = cursor.getBlob(i);
                Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(
                        Blobdata, 0, Blobdata.length), 150, 150, false);
                ((ImageView) view).setImageBitmap(bitmap);
                return true;
            } else {
                return false;
            }
        }
    });

有人可以帮助我把这段代码"翻译"成c#?或者使用其他代码。感谢帮助,对不起我的英语。

已编辑 2

好的,代码在哪里转换为 c#

class ViewBinder : Java.Lang.Object, SimpleCursorAdapter.IViewBinder
    {     
        public bool SetViewValue (View view, Android.Database.ICursor cursor, int i)
        {
            if (view.Id == Resource.Id.iv_photo) {
                byte[] Blobdata = cursor.GetBlob (i);
                Bitmap bitmap = Bitmap.CreateScaledBitmap (BitmapFactory.DecodeByteArray (
                                    Blobdata, 0, Blobdata.Length), 150, 150, false);
                ((ImageView)view).SetImageBitmap (bitmap);
                return true;
            } else {
                return false;
            }
        }     
    }

但是现在我在这一行中得到了一个错误:

byte[] Blobdata = cursor.GetBlob (i);

错误:

android.graphics.Bitmap cannot be cast to byte[]

我认为我在我的数据库中收到此错误,我没有使用 Blob 而是使用字节数组。有人知道如何从数据库中检索字节数组或如何使用 Blob 数据类型?

xamarin android ListView with image

您可以将字节数组存储在 BLOB 中。

这是我获取它的方式:

using (SqliteDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        images.Add(new Image((byte[])reader["Image"]));
    }
}

然后,我可以使用我的 Image 属性ImageByteArray将其转换为位图,类似于您所做的那样。

Bitmap image = BitmapFactory.DecodeByteArray(data, 0, barray.Length);

然后,Bitmap就可以在ImageView中显示。

imageView.SetImageBitmap(image);

如您所见,我们的方法非常相似。所以对我来说,这似乎cursor.GetBlob (i)回报了一些意想不到的东西。

public abstract byte[] getBlob (int columnIndex)

在 API 级别 1 中添加 以字节数组的形式返回所请求列的值。

结果以及此方法在列值为 null 或列类型不是 Blob 类型时是否引发异常是实现定义的。

参数: 列索引 目标列的从零开始的索引。

返回: 该列作为字节数组的值。

(http://developer.android.com/reference/android/database/Cursor.html#getBlob(国际))

根据该方法的描述,您的列似乎没有 BLOB/字节数组。

使用var Blobdata = cursor.GetBlob (i);找出其中的内容,并相应地进行调整。