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 数据类型?
您可以将字节数组存储在 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);
找出其中的内容,并相应地进行调整。