带有 TouchImageView 或 GestureImageView 的 PagerAdapter 未加载图像
PagerAdapter with TouchImageView or GestureImageView not loading images
当我使用简单的 imageview 或 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"/>
Activity
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;
}
问题是因为 TouchImageView or GestureImageView
从服务器加载图像需要时间,并且在加载图像后视图未更新。
我加了-
private class PageListener extends ViewPager.SimpleOnPageChangeListener
{
public void onPageSelected(int position)
{
imagePagerAdapter.notifyDataSetChanged();
}
}
在 activity class 中,以便每当用户滑动到新 page.But 时更新视图,我打开的第一个视图仍然显示空白..所以我添加了
h.postDelayed(r=new Runnable()
{
@Override
public void run() {
if (mPosition == position)
{
notifyDataSetChanged();
h.removeCallbacks(r);
}
}
}, 1000);
在适配器的 instantiateItem
内,以便在创建视图时在 1 秒后更新第一个视图,因为此时从服务器获取图像。mPosition
是第一个视图的位置打开。
这完全解决了我的问题。
当我使用简单的 imageview 或 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"/>
Activity
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;
}
问题是因为 TouchImageView or GestureImageView
从服务器加载图像需要时间,并且在加载图像后视图未更新。
我加了-
private class PageListener extends ViewPager.SimpleOnPageChangeListener
{
public void onPageSelected(int position)
{
imagePagerAdapter.notifyDataSetChanged();
}
}
在 activity class 中,以便每当用户滑动到新 page.But 时更新视图,我打开的第一个视图仍然显示空白..所以我添加了
h.postDelayed(r=new Runnable()
{
@Override
public void run() {
if (mPosition == position)
{
notifyDataSetChanged();
h.removeCallbacks(r);
}
}
}, 1000);
在适配器的 instantiateItem
内,以便在创建视图时在 1 秒后更新第一个视图,因为此时从服务器获取图像。mPosition
是第一个视图的位置打开。
这完全解决了我的问题。