Порядок изображений в представлении сетки в Android

У меня есть приложение для Android, в котором есть галерея с сеткой. В этом виде сетки я показываю изображения в полноэкранном режиме, когда пользователь нажимает на изображение. Это работает очень хорошо. Но проблема в том, что в представлении сетки изображения отображаются правильно, когда они появляются на экране в первый раз, но порядок меняется случайным образом, когда пользователь прокручивает его вниз, чтобы увидеть больше изображений. Вот мой код ниже для адаптеров, и вы можете посмотреть на фотографии.

    public class GridGallery extends BaseAdapter {

    Context context;

    public GridGallery(Context context) {
        this.context = context;
    }

    @Override
    public int getCount() {
        return urlList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        System.gc();

        ImageView view;

        if(convertView == null) {

            view = new ImageView(context);

            view.setScaleType(ImageView.ScaleType.FIT_CENTER);
            view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
            view.setAdjustViewBounds(false);
            view.setPadding(2, 2, 2, 2);

            imageLoader.DisplayImage(urlList.get(position), view);

            System.gc();

        }else {
            view = (ImageView) convertView;
        }

        System.gc();

        return view;
    }

}

А вот как я установил переходник ниже,

GridView g = (GridView) findViewById(R.id.myGrid);
        g.setAdapter(new GridGallery(context));

        isGalleryVisible = false;

        g.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                myPagerAdapter = new MyPagerAdapter(context);
                pager = (ViewPager) findViewById(R.id.gallery_view);
                pager.setAdapter(myPagerAdapter);
                pager.setCurrentItem(position);

                isGalleryVisible = true;

            }
        });

Вот мои снимки экрана, он повторяется, когда я его прокручиваю. И каждый раз, когда я прокручиваю вниз и возвращаюсь наверх, их места меняются случайным образом.

Любая помощь будет оценена. Заранее спасибо.


person osayilgan    schedule 23.05.2012    source источник


Ответы (2)


Да, я только что столкнулся с той же проблемой прямо сейчас. Я также использую концепцию ленивой загрузки Федора. Я не уверен, насколько это будет полезно и правильный ли это подход. Но все же это решило проблему для меня.

Мне пришлось внести небольшие изменения в getView(),

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

        System.gc();

        ImageView view;

        if(convertView == null) {

            view = new ImageView(context);

            view.setScaleType(ImageView.ScaleType.FIT_CENTER);
            view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
            view.setAdjustViewBounds(false);
            view.setPadding(2, 2, 2, 2);



            System.gc();

        }else {
            view = (ImageView) convertView;
        }
          if(view!=null)
            {
                   imageLoader.DisplayImage(urlList.get(position), view);
                   notifyDataSetChanged();  //Calling this helped to solve the problem. 
            }

        System.gc();

        return view;
    }
person Andro Selva    schedule 23.05.2012
comment
Спасибо, чувак, принял твой ответ за твое решение. Я хотел бы спросить еще кое-что, связанное с этим, этот вид сетки довольно медленный, у вас такой же? Вы знаете, как я могу сделать это быстрее? - person osayilgan; 23.05.2012
comment
Я не уверена. Но я столкнулся с проблемой, когда попытался использовать изображения с огромным разрешением. Попробуйте масштабировать. Сетка BCoz все равно будет небольшой ширины и высоты, зачем использовать огромные изображения. - person Andro Selva; 23.05.2012
comment
На самом деле я использую маленькие изображения, и я нашел проблему. Это произошло из-за сбора мусора. поскольку ленивая загрузка Федора использует слабые ссылки, вызов System.gc() убивает кеш памяти. Вот почему адаптер пытается создавать их каждый раз, когда я прокручиваю. - person osayilgan; 23.05.2012
comment
Но теперь у меня другая проблема, я попробовал ваш метод, и он работает очень хорошо. Но дело в том, что если прокрутить вниз один раз полностью, а когда я прокручиваю вверх, мое событие щелчка по элементу не работает. есть идеи? - person osayilgan; 23.05.2012

Я только что удалил

если (convertView==null) это работает

person Sushil Mittal    schedule 02.07.2014