PagerAdapter с TouchImageView или GestureImageView не загружает изображения

Когда я использую простой просмотр изображений или AspectRatioImageView, я могу загружать изображения, полученные с сервера. Но если я использую TouchImageView или GestureImageView, он не может загружать изображения. Я вижу пустой экран.

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

Однако, когда я открыл представление в viewpager и оно не показывает изображение. Затем, если я переключусь в ландшафтный режим, а затем снова в портретный режим, он сможет загрузить изображение. Если я вызову notifyDataSetChanged() в любом месте внутри адаптера, он вылетит, показывая InflateException

XML

<com.polites.android.GestureImageView
        android:id="@+id/imagefullscreen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:layout_gravity="center"/>

Деятельность

pager.setAdapter(imagePagerAdapter = new ImagePagerAdapter(ImagePagerActivity.this, posts));
pager.setCurrentItem(pos);
PageListener pageListener = new PageListener();
pager.setOnPageChangeListener(pageListener);

imagePagerAdapter.notifyDataSetChanged();

Адаптер

public ImagePagerAdapter(Activity activity,
                         List<Post> object) {
    this._activity = activity;
    posts = object;

    inflater = (LayoutInflater) _activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    options = new DisplayImageOptions.Builder()
            .showImageOnLoading(android.R.color.transparent)
            .showImageForEmptyUri(android.R.color.transparent)
            .showImageOnFail(android.R.color.transparent)
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .considerExifParams(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .build();
    imageLoader = ImageLoader.getInstance();
    imageLoader.init(ImageLoaderConfiguration.createDefault(_activity));

}

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

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, final int position) {
    final Post post = posts.get(position);
    View viewLayout = inflater.inflate(R.layout.item_pager_image, container,
            false);
    visualizerView = (VisualizerView) viewLayout.findViewById(R.id.visualizerView);


    image = (GestureImageView) viewLayout.findViewById(R.id.imagefullscreen);
    mGDescription = (TextView) viewLayout.findViewById(R.id.guggu_pager_description);
    image.setVisibility(View.VISIBLE);

    mGDescription.setVisibility(View.VISIBLE);

    play = (ImageView) viewLayout.findViewById(R.id.play);
    pause = (ImageView) viewLayout.findViewById(R.id.pause);
imageLoader.displayImage(url,images, options);
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //TODO:pausing audio/video here
            }
        });
    }
    container.addView(viewLayout);
    viewLayout.setTag("my" + position);
    return viewLayout;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

person Android Developer    schedule 05.06.2015    source источник


Ответы (1)


Проблема заключалась в том, что TouchImageView or GestureImageView требуется время для загрузки изображения с сервера, а представление не обновлялось после загрузки изображения.

Я добавил-

private class PageListener extends ViewPager.SimpleOnPageChangeListener
    {
        public void onPageSelected(int position)
        {


            imagePagerAdapter.notifyDataSetChanged();
        }
    }

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

h.postDelayed(r=new Runnable()
    {
        @Override
        public void run() {
            if (mPosition == position)
            {
                notifyDataSetChanged();
                h.removeCallbacks(r);


            }
        }
    }, 1000);

внутри instantiateItem адаптера, так что первое представление обновляется через 1 секунду, когда представление создается, поскольку к тому времени изображение извлекается с сервера. mPosition - это позиция первого открываемого представления.

Это полностью решает мою проблему.

person Android Developer    schedule 06.06.2015