Как предотвратить изменение положения изображений GridView при прокрутке?

Прежде всего, да, я знаю об этом вопросе, но ответ мне не помогает. Да, это решает проблему «изменения положения при прокрутке», но это не очень оптимальное решение моей проблемы. Позволь мне объяснить...

Итак, это мой getView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    UnscaledImageView imageView;

    if(convertView == null) {
        imageView = new UnscaledImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        imageView.setImageResource(mThumbIds[position]);
    } else {
        imageView = (UnscaledImageView)convertView;
    }

    return imageView;
}

И распространенным решением было бы переместить imageView.setImageResource(mThumbIds[position]); за пределы и ниже оператора if. Но это создает другую проблему...

Как вы могли заметить, я использую UnscaledImageView вместо ImageView. Это пользовательский подкласс ImageView, в котором я переопределил метод setImageResource() для ручного декодирования растровых изображений с некоторыми дополнительными параметрами в соответствии с моими потребностями. Ручное декодирование - вот что вызывает мою проблему.

Если метод setImageResource() останется внутри if, нет проблем, декодирование растрового изображения будет выполнено один раз для растрового изображения (во время загрузки GridView), и прокрутка будет плавной... Но изображения будут прыгать в разные позиции при каждой прокрутке .

Но если метод setImageResource() останется за пределами if, изображения не будут переходить на разные позиции, а все изображения будут постоянно декодироваться при каждом прокрутке. Прокрутка будет прерывистой и совсем не плавной.

Как я могу решить эту проблему? Любые идеи?


person rfgamaral    schedule 27.08.2012    source источник


Ответы (1)


Возможно, вы могли бы использовать какую-то буферизацию или кэширование для ваших декодированных изображений. Ваш метод setImageResource должен проверять, находится ли его входное изображение уже в буфере (т.е. было ли оно уже декодировано). Если это так, то ваш метод просто извлечет декодированное изображение из буфера. Если нет, то он декодирует изображение и сохраняет его в буфере для использования в будущем. Как реализовать буфер/кеш, зависит от ваших собственных потребностей. Я уверен, что есть масса возможностей. Таким образом, вы можете переместить вызов setImageResource из блока if-then и не придется декодировать изображение каждый раз, когда вызывается метод getView.

person Vicent    schedule 27.08.2012