Почему я должен проверить mPosition в моей AsyncTask onPostExecute?

Я использую AsyncTask лениво загружать изображения в мой ListView,

Это все работает правильно, но я не понимаю, почему я должен проверить мой mHolder.hPosition против mPosition в onPostExecute метод. Если я не проверю эти значения, старые изображения будут циклически повторяться ListItems - но почему mHolder.hPosition а также mPosition не всегда равны, если они вызываются в одном и том же AsyncTask?

Вот мой урезанный код:

 @Override
    public View getItemView(final int position, View convertView, final ViewGroup parent) {

        final ViewHolder holder;
        final Job job = (Job) getStore().get(position);

        if (convertView == null) {

            // New List Item

            holder = new ViewHolder();
            convertView = getInflater().inflate(ITEM_LAYOUT, parent, false);

            holder.hPosition = position;
            holder.hImageView = (ImageView) convertView.findViewById(R.id.app_component_joblistitemview_logo);

            convertView.setTag(holder);

        } else {

            // Recycled List Item

            holder = (ViewHolder) convertView.getTag(); // get the ViewHolder that is stored in the Tag
            holder.hPosition = position;
        }

        holder.hImageView.setImageBitmap(null); // set the list item's image to be blank
        new DownloadImageTask().execute(position, holder); // async download the image

        return convertView;
    }


    // DownloadImageTask
    private class DownloadImageTask extends AsyncTask<Object, Void, Integer> {

        Integer mPosition;
        ViewHolder mHolder;

        @Override
        protected Integer doInBackground(Object... params) {

            mPosition = (Integer)params[0];
            mHolder = (ViewHolder)params[1];

            // Download the Image ...

            // ...

            return 1;
        }

        protected void onPostExecute(Integer result) {

            // >> This is the Spot I am Asking About <<
            // Shouldn't mHolder.hPosition ALWAYS be equal to mPosition, since it's still the same AsyncTask?
            // Why are mHolder.hPosition and mPosition often not equal?

            if (mHolder.hPosition==mPosition) {

                // ... update the List View Item

            }
        }

    }

1 ответ

Пока вы загружаете изображение, вы можете продолжить прокрутку списка.

ViewHolder может быть переработан и может иметь другие данные в данный момент.

Чтобы проверить, находится ли ViewHolder в правильном положении, вы должны проверить, совпадает ли фактическая позиция на держателе с той же позицией, которая сгенерировала событие загрузки на onPostExecute.

Другие вопросы по тегам