滚动时,SimpleCursorAdapter会加载错误的图像

时间:2014-07-08 20:33:51

标签: android imageview simplecursoradapter

我搜索了很多,但我的问题看起来非常具体,即使它很“简单”......但我无法弄明白。

我有一个带有自定义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);
    }
}

0 个答案:

没有答案