自定义页面适配器上的空指针异常

Posted

技术标签:

【中文标题】自定义页面适配器上的空指针异常【英文标题】:Null Pointer Exception on custom pageradapter 【发布时间】:2013-07-31 21:03:45 【问题描述】:

下面的代码适用于我的 viewpager 适配器。

    import android.content.Context;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;

    import com.androidquery.AQuery;

    public class ViewPagerAdapter2 extends PagerAdapter 

    Context context;
    String[] image1;
    String[] description;


    LayoutInflater inflater;

    public ViewPagerAdapter2(Context context, String[] image1,String[] description) 
        this.context = context;
        this.image1 = image1;
        this.description=description;


    

    @Override
    public boolean isViewFromObject(View view, Object object) 
        return view == ((LinearLayout) object);
    

    @Override
    public Object instantiateItem(ViewGroup container, int position) 


        TextView des;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.slider, container,
                false);
        des = (TextView) itemView.findViewById(R.id.slider_des);
        des.setText(description[position]);
         AQuery aq = new AQuery(itemView);
         aq.id(R.id.imageView1).image(image1[position]);

         ((ViewPager) container).removeView(itemView);



        ((ViewPager) container).addView(itemView);

        return itemView;
    

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

    

    @Override
    public int getCount() 
        // TODO Auto-generated method stub
        return description.length;

    


我的片段的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
        LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(
                R.layout.home, container, false);

        new getFromWebService().execute();
        viewPager1 = (ViewPager) mLinearLayout.findViewById(R.id.pager);
        adapter1= new ViewPagerAdapter2(mLinearLayout.getContext(),image,title);
        viewPager1.setAdapter(adapter1);

        //ListView list = (ListView) mLinearLayout.findViewById(R.id.listView1);
        //Onadapter listadapter = new Onadapter(getActivity(),id,label,title,image,hrs,posted_date);
        //list.setAdapter(listadapter);

        return mLinearLayout;

    

我的 logcat 输出:

07-31 16:27:05.868: E/AndroidRuntime(1364): FATAL EXCEPTION: main
07-31 16:27:05.868: E/AndroidRuntime(1364): java.lang.RuntimeException: Unable to start activity ComponentInfocom.lyfcha/com.lyfcha.TestMainActivity: java.lang.NullPointerException
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.os.Looper.loop(Looper.java:137)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.ActivityThread.main(ActivityThread.java:4921)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at java.lang.reflect.Method.invokeNative(Native Method)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at java.lang.reflect.Method.invoke(Method.java:511)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at dalvik.system.NativeStart.main(Native Method)
07-31 16:27:05.868: E/AndroidRuntime(1364): Caused by: java.lang.NullPointerException
07-31 16:27:05.868: E/AndroidRuntime(1364):     at com.lyfcha.ViewPagerAdapter2.getCount(ViewPagerAdapter2.java:69)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:432)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at com.lyfcha.Home1.onCreateView(Home1.java:56)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.Activity.performStart(Activity.java:5216)
07-31 16:27:05.868: E/AndroidRuntime(1364):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2083)
07-31 16:27:05.868: E/AndroidRuntime(1364):     ... 11 more

我做了什么: 1、从String数组中的json中获取需要的数据。 2. 我为 viewpager 编写了一个适配器来向它提供内容。

我遇到问题的地方:

应用程序在我的片段的 onCreateView 中抛出空指针异常,指出我的适配器的 getCount 抛出 NPE。我确信字符串数组的长度不为空(在调试透视图的显示窗口中测试)。

任何帮助将不胜感激。

【问题讨论】:

告诉我们你在哪里填充或初始化title title 被声明为一个全局变量......它的大小在接收 json 数组的类中定义,并且从 json 接收的数据中插入循环中的值。我可以向您保证,字符串数组没有任何问题!它包含所需的值! 如果已经在另一个线程中填充,您应该考虑在线程完成后添加您的适配器。 【参考方案1】:

您应该从用于获取数据的 AsyncTask 中填充适配器。由于getFromWebService 在不同的线程中执行,所以行

adapter1= new ViewPagerAdapter2(mLinearLayout.getContext(),image,title);

仍然没有来自其他线程的数据。因此,解决方案是移动以下行:

LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(
                R.layout.home, container, false);

        viewPager1 = (ViewPager) mLinearLayout.findViewById(R.id.pager);
        adapter1= new ViewPagerAdapter2(mLinearLayout.getContext(),image,title);
        viewPager1.setAdapter(adapter1);

到你的 AsyncTask 的 onPostExecute() 方法 getFromWebService

【讨论】:

我认为这不会是一个问题,因为在执行 getFromWebService 之后,它按预期将值插入到我全局声明的字符串数组中!我检查了每个变量的值,那部分没有错误。我在 AsyncTask 完成任务后使用了这些值 我看到的问题是你不会等待getFromWebService 执行(它在一个单独的线程中),所以如果getFromWebService 在一个单独的线程中,description 将为空。 谢谢!我太愚蠢了,竟然不这样想!如此愚蠢的错误!非常感谢!

以上是关于自定义页面适配器上的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

在扩展数组适配器时自定义适配器的getView()中的空指针异常

设置列表项的值时自定义适配器中的空指针异常

片段中的 EditText 上的空指针异常 [重复]

getLatitude 上的空指针异常

getGraphics() 上的空指针异常

OnGridImageSelectedListener.onGridImageSelected 上的空指针异常