我搜索了很多,但我的问题看起来非常具体,即使它很“简单”......但我无法弄明白。
我有一个带有自定义ViewBinder的SimpleCursorAdapter,可以通过URL在ImageView中显示图像。
我的项目模板:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/postImage"
android:layout_width="86dp"
android:layout_margin="8dp"
android:layout_height="48dp"
android:background="#FFFFFF"
android:src="@drawable/defaultImg"
android:scaleType="fitCenter" />
<TextView android:id="@+id/textinfos1"
android:textSize="14sp"
android:layout_margin="8dp"
android:layout_width="match_parent"
android:textColor="@android:color/white"
android:layout_height="wrap_content"
/>
</LinearLayout>
这里是我设置SimpleCursorAdapter的ListFragment的OnCreate方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] uiBindFrom = { MyDatabase.COL_TITLE, MyDatabase.COL_URL };
int[] uiBindTo = { R.id.textinfos1 , R.id.postImage };
getLoaderManager().initLoader(0, null, this);
mAdapter = new SimpleCursorAdapter(
getActivity().getApplicationContext(), R.layout.infos_list_item,
null, uiBindFrom, uiBindTo,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){
public boolean setViewValue(View view, Cursor cursor, int columnIndex){
if(view.getId() == R.id.postImage){
String imgUri = cursor.getString(columnIndex);
ImageView imageView = (ImageView)view;
new DownloadImageTask(imageView).execute(imgUri);
return true;
}
return false;
}
});
setListAdapter(mAdapter);
}
如果我的视图是“R.id.postImage”,我会执行异步调用,将我的imgUrl转换为Drawable,这样可以正常工作。
当我滚动列表时出现问题。加载了新项目,但在1/2秒内,较新的ImageView显示“弹出”ImageViews的图像。在此之后,将显示权利图像。
更简单的版本,当我向下滚动时,从屏幕顶部消失的图像会显示在底部的新ImageView中。这也发生在另一方面。 (滚动到顶部并显示失踪者。)
我正在考虑在我的ImageView上设置标签并检查它,但我不确定如何检查它。
有没有办法将加载的图像保存在一种缓存中? 我是否需要创建自定义CursorAdapter来提供此机制?或者我做错了什么?
非常感谢。
编辑1 这是我的DownloadImageTask:
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView imageView;
public DownloadImageTask(ImageView imageView) {
this.imageView = imageView;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap imgBitmap = null;
InputStream in = null;
try {
in = new java.net.URL(urldisplay).openStream();
imgBitmap = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
finally
{
try {
if(in != null)in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return imgBitmap;
}
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}
}