如何使用Android的PagerAdapter类自动显示图像?

时间:2014-05-07 09:17:49

标签: java android multithreading runnable

由于不推荐使用android的图库小部件,我发现了另一种实现照片库的方法。

Class ImageAdapter.java

public class ImageAdapter extends PagerAdapter {

private Context context;
private int curPlayImg= 0; 
private ImageView imageView;
private Handler advPageHandler = new Handler();

public Integer[] mThumbIds={
        R.drawable.adv_pic1,
        R.drawable.adv_pic2,
        R.drawable.adv_pic3 ,
        R.drawable.adv_pic4,
        R.drawable.adv_pic5 
};

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

/**
 * return the image number.
 */
@Override
public int getCount() {
    return mThumbIds.length;
}

@Override
public boolean isViewFromObject(View view, Object obj) {

    return view==((ImageView)obj);  
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    imageView = new ImageView(context);
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(10, 10, 10, 10);
    imageView.setImageResource( mThumbIds[ position ] );                        
    ((ViewPager) container).addView(imageView, 0);
    return imageView;
}

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

类FullscreenActivity.java

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen);
    ViewPager viewPager= (ViewPager)findViewById(R.id.viewPager);
    ImageAdapter adapter= new ImageAdapter(this);
    viewPager.setAdapter(adapter);
}

效果很好,但我想让ImageAdapter中的图像自动逐个显示。 因此,我创建了一个线程来处理它。

我在中添加了一个方法 类 ImageAdapter.java

public void displayAdv()
{
    Timer timer= new Timer();
timer.schedule(new TimerTask()
    {
        @Override
        public void run()
        {
        advPageHandler.post(
         new Runnable(){
          public void run()
              {
           imageView.setImageResource( mThumbIds[ curPlayImg] );
            curPlayImg++;
                curPlayImg= curPlayImg % getCount();                    
                            }
                 });
        }
    }, 0, 1000);
}

并调用方法:

public class FullscreenActivity extends Activity{

@Override 
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen);
    ViewPager viewPager= (ViewPager)findViewById(R.id.viewPager);
    ImageAdapter adapter= new ImageAdapter(this);
    viewPager.setAdapter(adapter);
    adapter.displayAdv();
}

但是我收到了一条错误消息:

错误日志:

E/AndroidRuntime(10295): FATAL EXCEPTION: main
E/AndroidRuntime(10295): java.lang.NullPointerException
E/AndroidRuntime(10295):    at                com.example.testview3.ImageAdapter$1$1.run(ImageAdapter.java:123)
E/AndroidRuntime(10295):    at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(10295):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(10295):    at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(10295):    at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(10295):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(10295):    at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(10295):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850)
E/AndroidRuntime(10295):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
E/AndroidRuntime(10295):    at dalvik.system.NativeStart.main(Native Method)

我创建了一个对象适配器,它应该已经 instantiateItem 所以我很困惑

  1. 为什么会出现这种错误?

  2. 如何解决?

  3. 有更好的替代代码吗?

1 个答案:

答案 0 :(得分:0)

我觉得你的做法是正确的。使用View Pager作为寻呼机适配器的容器。接下来,您可以使用ViewPager的以下API:

public void setCurrentItem (int item, boolean smoothScroll)

这将转换到指定的页面。您可以创建某种计时器或任何需要迭代页面的套件。

希望这有帮助!