1

最初,我从服务器获取数据列表并将其设置为 listview。

向下滚动列表视图时,我正在从服务器收集数据并调用我的自定义适配器的 notifydatasetchanged。

在自定义适配器的 getView() 方法中,我通过 asyntask 从服务器下载图像。当它成功下载并存储在本地时。然后只是尝试在该异步任务的 onPostExecute 刷新列表视图。但它没有得到刷新。

onPostExecute 的日志正在打印,但 listview 没有刷新。

public void loadBitmap(MainActivity mainActivity, String imageKey,ImageView imageView, boolean isScrolling) { final Bitmap bitmap = getBitmapFromCache(imageKey);

    if (bitmap != null) {
        imageView.setImageBitmap(bitmap);
    } else {
        imageView.setImageResource(R.drawable.ic_launcher);
        if (!isScrolling && !mCurrentTasks.contains(imageKey)
                && mainActivity.internetIsAvailable()) {
            BitmapLoaderTask task = new BitmapLoaderTask(imageKey,
                    mainActivity.getAdapter());
            task.execute();
        }
    }
}

private class BitmapLoaderTask extends AsyncTask<Void, Void, Bitmap> {
    private ListAdapter mListAdapter;
    private String mImageKey;

    public BitmapLoaderTask(String imageKey, ListAdapter adapter) {
        mListAdapter = adapter;
        mImageKey = imageKey;
    }

    @Override
    protected void onPreExecute() {
        mCurrentTasks.add(mImageKey);
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        Bitmap b = null;
        try {
            URL url = new URL(mImageKey);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.connect();
            b = BitmapFactory.decodeStream(connection.getInputStream());

            if (b != null) {
                int width = b.getWidth();
                int height = b.getHeight();

                if (width >= mMaxWidth || height >= mMaxHeight) {
                    while (true) {
                        if (width <= mMaxWidth || height <= mMaxHeight) {
                            break;
                        }
                        width /= 2;
                        height /= 2;
                    }
                    b = Bitmap.createScaledBitmap(b, width, height, false);
                }

                connection.disconnect();
                addBitmapToCache(mImageKey, b);
                return b;
            }
            return null;
        } catch (IOException e) {
            if (e != null) {
                e.printStackTrace();
            }
            return null;
        }
    }

    @Override
    protected void onPostExecute(Bitmap param) {
        mCurrentTasks.remove(mImageKey);
        if (param != null) {
            mListAdapter.notifyDataSetChanged();
        }
    }
}
4

2 回答 2

0

尝试将ImageViewfor each 位图传递到BitmapLoaderTaskat 构造中,并将其ImageView作为内部成员变量保留。完成加载位图后,使用该onPostExecute方法将该位图指定为ImageView可绘制对象。

private class BitmapLoaderTask extends AsyncTask<Void, Void, Bitmap> {

  private String mImageKey;
  private ImageView mImageView;

  public BitmapLoaderTask(ImageView imageView, String imageKey) {
    mImageView = imageView;
    mImageKey = imageKey;
  }

  protected void onPreExecute() {

    /* Pre execute stuff */

  }

  protected Bitmap doInBackground(Void... params) {

    /* Your bitmap processing */

    return bitmap;
  }

  protected void onPostExecute(Bitmap param) {
    if(param != null) {
      mImageView.setImageBitmap(param);
    }
  }
}

这是一个完美的例子AsyncTask。该doInBackground()方法在后台线程上运行,因此不会干扰 UI 处理,但 android 权限规定不允许此类后台线程接触 UI 元素。这就是onProgressUpdate()andonPostExecute()的用途,只要doInBackground达到值得更新的里程碑,它们就会在主 UI 线程上运行快速的 UI 更新。在这种情况下,您使用它们来通知您的 ImageView 对象,当它们相应的位图准备好时。

于 2015-04-22T21:42:25.173 回答
0

您的代码看起来正确..但我认为问题可能是mainActivity.getAdapter()我认为您应该全局声明适配器。

私有 AdapterYourCustomAdapter 适配器;

然后在 onCreate()

adapter = new AdapterYourCustomAdapter(context,arraylist(whatever constructor is));

然后像这样传递调用它:

if (bitmap != null) {
        imageView.setImageBitmap(bitmap);
    } else {
        imageView.setImageResource(R.drawable.ic_launcher);
        if (!isScrolling && !mCurrentTasks.contains(imageKey)
                && mainActivity.internetIsAvailable()) {
            new BitmapLoaderTask( imageKey, adapter ).execute();
        }
    }
于 2013-05-30T05:52:23.913 回答