android - 如何解决viewpager android中的空对象引用

标签 android xml android-layout android-activity android-viewpager

我正在使用查看寻呼机来滑动图像。我可以在 Log 中获取 url,但是当我尝试在 ImageView 中设置时,我收到错误如下。

        E/AndroidRuntime(1895): FATAL EXCEPTION: main
   E/AndroidRuntime(1895): Process: com.project.center, PID: 1895
    E/AndroidRuntime(1895): java.lang.NullPointerException: Attempt to read from field    com.project.center.views.TouchImageView com.project.center.FullScreenActivity$ViewHolder.mImageView' on a null object reference
   E/AndroidRuntime(1895):  at   com.project.center.FullScreenActivity$ViewPagerAdapter.instantiateItem(FullScreenActivity.java:82)
   : E/AndroidRuntime(1895):    at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
    E/AndroidRuntime(1895):     at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:837)
   E/AndroidRuntime(1895):  at android.support.v4.view.ViewPager.populate(ViewPager.java:987)
   E/AndroidRuntime(1895):  at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
   E/AndroidRuntime(1895):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
   E/AndroidRuntime(1895):  at android.view.View.measure(View.java:17430)
    E/AndroidRuntime(1895):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
 : E/AndroidRuntime(1895):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
  E/AndroidRuntime(1895):   at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
  E/AndroidRuntime(1895):   at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
   E/AndroidRuntime(1895):  at android.view.View.measure(View.java:17430)
   E/AndroidRuntime(1895):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
   E/AndroidRuntime(1895):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
   E/AndroidRuntime(1895):  at android.view.View.measure(View.java:17430)
   E/AndroidRuntime(1895):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
    E/AndroidRuntime(1895):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447)
    E/AndroidRuntime(1895):     at android.view.View.measure(View.java:17430)
    E/AndroidRuntime(1895):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
    E/AndroidRuntime(1895):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)

我在代码中检查了很多次,但无法解决该错误。

public class FullScreenActivity extends Activity {
private ViewPager viewPager;
ViewPagerAdapter viewpageradapter;
ArrayList<String> imageUrl;
private Intent mIntent;
private int imagePosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.image_viewpager);
    mIntent = getIntent();
    imageUrl = mIntent.getStringArrayListExtra("url");
    imagePosition = mIntent.getIntExtra("imageurl", 0);
    viewPager = (ViewPager) findViewById(R.id.myfivepanelpager);
    viewpageradapter = new ViewPagerAdapter(this, imageUrl);
    viewPager.setAdapter(viewpageradapter);
}

class ViewPagerAdapter extends PagerAdapter {
    Activity activity;
    ArrayList<String> imgArray;
    public ImageLoader imageLoader;
    ViewHolder viewHolder;

    public ViewPagerAdapter(Activity act, ArrayList<String> imgArra) {
        imgArray = imgArra;
        activity = act;
        imageLoader = new ImageLoader(act);
        aquery = new AQuery(act);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return imgArray.size();
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub
        return arg0 == ((View) arg1);
    }

    public Object instantiateItem(View convertView, int position) {

        LayoutInflater layoutinflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
             viewHolder = new ViewHolder();
            convertView = layoutinflater.inflate(
                    R.layout.image_viewpager_row, null);
            viewHolder.mImageView = (TouchImageView) convertView
                    .findViewById(R.id.imageViews);
            convertView.setTag(viewHolder);
        } else
            viewHolder = (ViewHolder) convertView.getTag();

        String imgUrl = imgArray.get(position);
         Log.e("imgUrl",imgUrl); // i can get image url here.
        imageLoader.DisplayImage(imgUrl, viewHolder.mImageView);
        return convertView;
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);
    }

    @Override
    public Parcelable saveState() {
        return null;
    }


}
static class ViewHolder {
    public TouchImageView mImageView;
}

}

这是 viewpager xml:

 <android.support.v4.view.ViewPager
    android:id="@+id/myfivepanelpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

和 image_viewpager.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.project.center.TouchImageView
        android:id="@+id/imageViews"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

请帮我解决这个问题。

最佳答案

尝试更改您的instantiateItem代码,例如

  public Object instantiateItem(View container2, int position) {

    LayoutInflater layoutinflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View ve = layoutinflater.inflate(R.layout.image_viewpager_row, null);

    TouchImageView  mImageView = (TouchImageView) ve.findViewById(R.id.imageViews);

    String imgUrl = imgArray.get(position);
     Log.e("imgUrl",imgUrl); // i can get image url here.
    imageLoader.DisplayImage(imgUrl, mImageView);

    ((ViewPager) container2).addView(ve, 0);

    return ve;
}

这里不需要使用ViewHolder

关于android - 如何解决viewpager android中的空对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27614375/

相关文章:

java - 保存 imageButton 可见性 [Android]

清除 RAM 内存时 Android 应用程序崩溃

c# linq xml 如何为同一个命名空间使用两个前缀

android - 此界面的最佳父级布局?

android - 模拟器中的人脸检测 android + 网络摄像头预览

android - 在Listview中动态更改(List item)TextView的颜色

android - tableLayout 中的复选框 selectAll\DeselectAll

android - 使用 Admob 插页式广告时出现内存泄漏

java - 在一个布局屏幕中创建多个 (26) 个按钮

sql-server - 如何使用 SQL Server 2016 删除 XML 子节点