我需要一些建议。 我有一个带有ViewPager的片段。我将它用作带有一些图像的图库。图像从Web加载并存储在Bitmap数组中。
起初我用过..
public class GalleryPageAdapter extends PagerAdapter {
public GalleryPageAdapter(){
}
public Object instantiateItem(View collection, int position) {
}
...
//all other methods
}
但是,现在不推荐使用instatiateItem和其他方法...... 我做了一些研究跟随其他帖子 Class extending Fragment - error says make sure class name exists, is public, and has an empty constructor that is public和 Unable to instantiate fragment make sure class name exists, is public, and has an empty constructor that is public
现在它可以正常工作
public class sEstablecimiento extends android.support.v4.app.FragmentActivity{
static BitmapDrawable iconos[];
//load bitmaps into iconos[] from web
static class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
static int position;
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
this.position=position;
return new ScreenSlidePageFragment();
}
@Override
public int getCount() {
return iconos.length;
}
}
public static class ScreenSlidePageFragment extends Fragment {
private BitmapDrawable image;
public ScreenSlidePageFragment() {
image=iconos[ScreenSlidePagerAdapter.position];
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView =(ViewGroup)inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
ImageView icono=(ImageView)rootView.findViewById(R.id.imagen);
icono.setImageDrawable(iconos[ScreenSlidePagerAdapter.position]);
return rootView;
}
}
而且,和往常一样,这是我的具体问题
提前,比你的时间和注意力。
答案 0 :(得分:1)
我认为你应该回到这个用例的原始代码 - 如果你只想展示一个图像库,那么基于Views而不是Fragments构建一个ViewPager要简单得多。当您为每个页面设置更复杂的屏幕时,通常会使用片段,例如如果ViewPager是顶级导航UI。
对于静态Drawable引用可能遇到的问题,有一个非常古老但still relevant article。 Drawables引用了Views,它引用了一个Activity。通过使用静态Drawable引用,您可以轻松泄漏Activity上下文。如果同时支持垂直和纵向方向,则每次旋转设备时都会销毁并重新创建活动。在这种情况下,您需要注意如何保留加载的位图(您只想在用户离开Activity时清除数组,而不是在它们旋转时清除数组)。
PagerAdapter类实际上有两个版本的instantiateItem方法:
不推荐使用原始版本(#1)以支持第二种方法。当您重写instantiateItem时,通常需要将View添加到容器中。使用第一个方法签名,您首先需要在添加之前将容器转换为ViewGroup。第二种方法签名通过从一开始就为您提供ViewGroup来避免这种情况。 PagerAdapter中有几个类似的已弃用的方法 - 它们都具有相同的版本,它们采用ViewGroup而不是View。
以下是一些(未经测试的)示例代码,它实现了PagerAdapter来显示图像:
public class GalleryPagerAdapter extends PagerAdapter {
private Context mContext;
private BitmapDrawable[] mIcons;
public GalleryPagerAdapter(Context context, BitmapDrawable[] icons) {
mContext = context;
mIcons = icons;
}
@Override
public int getCount() {
return mIcons.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
// You can inflate a layout here instead and apply styling to the ImageView
ImageView imageView = new ImageView(mContext);
BitmapDrawable icon = mIcons[position];
imageView.setImageDrawable(icon);
container.addView(imageView, 0);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}