Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用SimpleCursorAdapter.setViewImage时调用的生命周期_Android_Android Imageview_Simplecursoradapter_Android Viewbinder - Fatal编程技术网

Android 使用SimpleCursorAdapter.setViewImage时调用的生命周期

Android 使用SimpleCursorAdapter.setViewImage时调用的生命周期,android,android-imageview,simplecursoradapter,android-viewbinder,Android,Android Imageview,Simplecursoradapter,Android Viewbinder,好的,尝试从我的SD卡中获取图像以显示在活动列表视图中 我读了很多提示,但我遗漏了一个重要的部分。我想看一小段说明这一点的源代码,但还没有找到任何东西 根据我的研究,执行listview.setadapter(SimpleCursorAdapter适配器)时,会调用bindview()。文档说明,如果ViewBinder无法处理ImageView,则setImageView由bindview调用 您可以指定FROM数组中的字段、TO数组中文本视图的id、光标以及具有文本视图的视图组。然后将适配器

好的,尝试从我的SD卡中获取图像以显示在活动
列表视图中

我读了很多提示,但我遗漏了一个重要的部分。我想看一小段说明这一点的源代码,但还没有找到任何东西

根据我的研究,执行
listview.setadapter(SimpleCursorAdapter适配器)
时,会调用
bindview()
。文档说明,如果
ViewBinder
无法处理
ImageView
,则
setImageView
bindview
调用

您可以指定
FROM
数组中的字段、
TO
数组中
文本视图
id
、光标
以及具有
文本视图
的视图组。然后将适配器设置为
列表视图
,瞧,它发生了

我认为通话顺序是:
listView.setAdapter(SimpleCursorAdapter)->adapter.bindView()->adapter.setTextView

Bindview必须确定视图的类型为
TextView,确定它可以绑定它,从光标传递
TextView
和文本值,然后
setTextView`执行它的操作

因此,对
ImageView
的调用非常相似,对吗

listViw.setAdapter(SimpleCursorAdapter adapter)->adapter.bindView()->adapter.setImageView
所以当遇到类型为
ImageView
的对象时,它会做什么?是否有类似于
setTextView
中的默认实现?我想这很难做到,因为图像变化太大了。文本是文本,但图像具有格式、大小、深度、比例、位置等。传递到
setTextView
的字符串是文本,即有效负载。在图像中,字符串(可能)是文件名,只是图像的起点

我想我需要使用数据库列名来构建适配器,该列名保存来自的
中的文件名。
TO
数组在我的布局中只有
ImageView
的id。我想我可以使用默认的viewbinder bindview(),但必须重写
setImageView()
以获取预期的字符串(文件名),并构建图像加载行以在预期的应用程序路径中找到该图像名称

因此,这将是(也许):


这听起来对吗?如果有人能填补缺失的空白和/或提供一些可用的源代码,这将非常有帮助。顺便说一句,我已经编写了代码来实现这一点,但它不起作用。这可能是一个非常简单的bug,如果它可以的话,就不想停止这个线程。我想我只需要在正确的方向上稍微推动一下。

我不太明白你的问题是什么(是的,你应该发布失败的代码),所以这里是我的答案(你也可以在
SimpleCorsorAdapter
的源代码中看到这一点):

SimpleCursorAdapter
中,当
ListView
需要显示新的
视图时,将调用方法
getView()
。此方法将行生成委托给两种方法:
newView()
(这将创建
视图
(膨胀您设置的xml布局),并将
视图的数组设置为标记,其中
ID
数组)和
bindView()
(这将实际将数据绑定到由
newView()
创建的
View

bindView()
然后将遍历
View
s的数组(从
数组的
View
s和
id
s)来绑定数据。它还将调用
getString
(只有
getString
方法,这一点很重要)接下来,该方法检查适配器上是否设置了
ViewBinder
,如果是这种情况,它将让该
ViewBinder
设置数据(如果
ViewBinder
成功绑定数据,将不会调用
setTextView()
setImageView()
方法)

如果适配器上未设置
ViewBinder
,或者
ViewBinder
setViewValue
方法返回
false
(表示
ViewBinder
失败),则
bindView()
方法将检查并查看它处理的是哪种类型的
View
TextView
ImageView
)并调用
setViewText()
setViewImage()


setViewImage()
的实现将尝试将提供的字符串解析为
int
(例如:图像id
R.drawable.image
),如果失败,则将
字符串
解析为
Uri
,并使用
setImageUri()
图像视图上
这样一个
int
R.drawable.image
或者一个
字符串
“file://mnt/sdcard/photo100.jpg"
应该与
SimpleCursorAdapter
的默认实现一起工作,否则将覆盖
setImageView
我不太明白您的问题是什么(是的,您应该发布失败的代码),因此下面是我的答案(您也可以在
SimpleCursorAdapter
的源代码中看到这一点):

SimpleCursorAdapter
中,当
ListView
需要显示新的
视图时,将调用方法
getView()
。此方法将行生成委托给两个方法:
newView()
(这将创建
视图
(扩展您设置的xml布局)并将
视图
的数组设置为标记,其中包含
ID
数组)和
绑定视图()
(这将实际将数据绑定到由
新建视图()创建的
视图

bindView()
然后将遍历
View
s的数组(带有
listView.setAdapter(MyOwnSimpleCursorAdapter myOwnAdapter)->myOwnAdapter.super.bindView()->myOwnAdapter.setImageView()