Android-使用asynctask加载图像的Listview-有时显示图像,有时不显示
我正在尝试应用asynctask在listview项目中加载图像 我还试图比较两个值,以便知道视图是否仍然需要加载图像Android-使用asynctask加载图像的Listview-有时显示图像,有时不显示,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我正在尝试应用asynctask在listview项目中加载图像 我还试图比较两个值,以便知道视图是否仍然需要加载图像 @Override public void bindView(View view, Context context, Cursor cursor) { holder = (ViewHolder) view.getTag(); picPath = cursor.getString(18); if(picPath =
@Override
public void bindView(View view, Context context, Cursor cursor) {
holder = (ViewHolder) view.getTag();
picPath = cursor.getString(18);
if(picPath == null || picPath.isEmpty()){
holder.myImage.setVisibility(View.GONE);
}else{
savingPath = picPath;
AsyncTask<Void, Void, Void> showImage = new AsyncTask<Void, Void, Void>(){
Bitmap b1;
String syncPath;
@Override
protected Void doInBackground(Void... params) {
syncPath = savingPath;
b1 = setImageToImageView(syncPath);
return null;
}
@Override
protected void onPostExecute(Void result) {
if (syncPath.equalsIgnoreCase(picPath)){
holder.myImage.setTag(syncPath);
holder.myImage.setImageBitmap(b1);
holder.myImage.setVisibility(View.VISIBLE);
}else{
}
}
}
}
};
showImage.execute();
if (syncPath.equalsIgnoreCase(picPath))
我得到的是,有时它加载图像,有时它只加载几个,而且总是相同的图像
你知道我做错了什么吗
谢谢你的帮助
编辑
这是我所做的更改(仍然不起作用-使应用程序崩溃)
if(holder!=null&&holder.bitmage!=null){
holder.myImage.setImageBitmap(holder.biImage);
holder.myImage.setVisibility(View.GONE);
}否则{
savingPath=picPath;
AsyncTask showImage=新建AsyncTask(){
位图b1;
字符串同步路径;
@凌驾
受保护的Void doInBackground(Void…参数){
syncPath=savingPath;
b1=setImageToImageView(同步路径);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
holder.myImage.setTag(syncPath);
holder.myImage.setImageBitmap(holder.biImage);
holder.BITMAGE=b1;
holder.myImage.setVisibility(View.VISIBLE);
}
};
showImage.execute();
您可能遇到同步问题,因为所有异步任务都共享保存路径。我建议您使用一些常用的库来加载图像:
这些是一些最流行的。它们非常易于使用,而且内置了缓存,因此您无需检查url是否相同-如果已经加载图像,库将从缓存中加载图像。我真的不认为需要使用if(picPath==null | | picPath.isEmpty())条件,因为如果您已经下载了图像,您可以将位图设置为view holder以保存位图对象。在holder中添加一个字段作为位图位图bitImage,并分配b1
改变这个
if(picPath == null || picPath.isEmpty())
作为
你介意将代码格式化一点,让我们更容易阅读和理解吗?不应该只需要一分钟左右…我尝试了…可读性更强一点我想我不是在下载图像,是手机公用文件夹中的图像。picPath是我从我的应用程序DB中获取的文件路径。你用-bitmag在代码中是什么意思e-它代表什么?在holder Classic中添加一个变量位图BITMAGE;,我真的不明白这段代码对我的尝试意味着什么。你说如果-holder!=null&&holder.BITMAGE!=null-那么我将holder设置为holder.BITMAGE-好的,为什么?下一步是什么?我有一个异步任务-这段代码用于在美国er正在ListView上滚动如果位图不在holder中,则仅使用async task.ok加载,然后在else中,您说将我将获得的位图放入holder.bitImage-但holder.bitImage未设置在holder.myImage上显示图片的任何位置。
if(picPath == null || picPath.isEmpty())
if(holder != null && holder.bitImage != null)
{
// set bitmap
holder.myImage.setImageBitmap(holder.bitImage)
}
else
{
// load the image using async task and set it to holder.bitImage
// also set it to the image view
holder.myimage.setImageBitmap(b1); // lets assume b1 is your image bitmap
holder.bitImage = b1;
}