【问题标题】:ArrayAdapter.createViewFromResource (Null PointerException)ArrayAdapter.create View From Resource (Nullpointerexception)
【发布时间】:2013-11-29 09:00:57
【问题描述】:

所以我找到了导致我的问题的确切原因,但不知道如何解决它。首先,我有一个看起来像这样的列表。 !(http://i.imgur.com/CJPiCcq.png)

我可以用 5 个或更少的项目填充此列表视图,然后单击任何项​​目,警报对话框将弹出而没有任何问题。 但是当我尝试将 6 个或更多项目添加到列表视图时,并单击程序崩溃的任何项目。并给我错误

12-18 03:31:27.582: D/AndroidRuntime(2187): Shutting        down VM
12-18 03:31:27.582: W/dalvikvm(2187): threadid=1: thread exiting with uncaught exception (group=0x95b57648)
12-18 03:31:27.582: E/AndroidRuntime(2187): FATAL EXCEPTION: main
12-18 03:31:27.582: E/AndroidRuntime(2187): java.lang.NullPointerException
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at com.android.internal.app.AlertController$AlertParams$1.getView(AlertController.java:879)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.AbsListView.obtainView(AbsListView.java:2161)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.ListView.onMeasure(ListView.java:1159)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.View.measure(View.java:15848)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.View.measure(View.java:15848)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.View.measure(View.java:15848)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.View.measure(View.java:15848)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.View.measure(View.java:15848)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.View.measure(View.java:15848)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1079)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.Choreographer.doFrame(Choreographer.java:532)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.os.Handler.handleCallback(Handler.java:730)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.os.Looper.loop(Looper.java:137)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at android.app.ActivityThread.main(ActivityThread.java:5103)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at java.lang.reflect.Method.invoke(Method.java:525)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-18 03:31:27.582: E/AndroidRuntime(2187):     at     dalvik.system.NativeStart.main(Native Method)

还有代码:

    private class MyListAdapter extends ArrayAdapter<Item> {

    public MyListAdapter(){
        super(UserOrderMenu.this,R.layout.itemview, customerItems);
    }

    @Override // position = is which listview item
    public View getView(int position, View convertView, ViewGroup parent) {


        View itemView = convertView;

        if(itemView == null){ //makes sure we have a view to work with
            itemView = getLayoutInflater().inflate(R.layout.itemview,parent,false);
        }

        //find the item to work with. using item class and customerItem ArrayList
        final Item currentItem = customerItems.get(position);
            //currentItem is the current Item object @ location position
            //customerItems is the ArrayList that is storing all the Item objects

        ImageView imageview = (ImageView) itemView.findViewById(R.id.imageButtonTrashCan);
        imageview.setClickable(true);
        imageview.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                remove(currentItem); //this removes the current item fromt the ListView
                notifyDataSetChanged(); //this notifies the Arrayadapter to update

                float t1price, t2price, t3price, t4price, t5price;
                System.out.println(currentItem.getTopping1Used());

                if(currentItem.getTopping1Used()){      
                    t1price = currentItem.getTop1P();

                }else
                    t1price = 0;

                if(currentItem.getTopping2Used()){
                    t2price = currentItem.getTop2P();
                }else
                    t2price =0;

                if(currentItem.getTopping3Used()){
                    t3price = currentItem.getTop3P();
                }else
                    t3price = 0;

                if(currentItem.getTopping4Used()){
                    t4price = currentItem.getTop4P();
                }else
                    t4price =0;

                if(currentItem.getTopping5Used()){
                    t5price = currentItem.getTop5P();       
                }else
                    t5price =0;
                    findTotalPrice(-t1price,-t2price,-t3price,-t4price,-t5price,true);
                    findTotalPrice(-currentItem.getItemP());                
            }
        });

        //Item Name
        TextView n = (TextView) itemView.findViewById(R.id.tvItemName);
        n.setText(currentItem.getItem());

        //Item Price
        //left here
        // do we want to add User Selected Toppings to the total price on the List View?
        //if so use currentItem.getTopping1Used();
            // then currentItem.getTop1P();
        TextView p = (TextView) itemView.findViewById(R.id.tvItemPrice);    
        p.setText(String.valueOf(currentItem.getItemP()));

        return itemView;
    }

}//end of MyListAdapter Class





private void populateListView(){ //this is how to add an item to ListView
    customerItems.removeAll(Collections.singleton(null)); //remove later
    customerItems.removeAll(Arrays.asList(null,""));
    ArrayAdapter<Item> adapter;

    try{
         adapter = new MyListAdapter();
         ListView list = (ListView) findViewById(R.id.listView1);
         list.setAdapter(adapter);
    }catch(Exception e){

    }



}

【问题讨论】:

    标签: android nullpointerexception android-arrayadapter


    【解决方案1】:

    customerItems 中只有 5 个Item 时,此代码会崩溃。确保那里有 5 个以上。

    【讨论】:

    • 实际上,每当我将 6 个或更多项目添加到列表视图时,它似乎会崩溃,然后继续单击 6 个或更多项目中的任何一个。唯一可行的方法是我只添加 5 个或更少的项目。
    • Cancer 你能解释一下为什么 customerItems 会在只有 5 个的情况下崩溃。我有点新(学生),任何知识将不胜感激
    • @hiRawr 我认为你应该删除remove(currentItem); 为什么你还有它?
    • 按下垃圾桶按钮时,该函数会从列表视图中删除该项目(在调用 notifydatasetchanged 之后)
    • 你能告诉我它在哪一行崩溃吗?
    【解决方案2】:

    使用以下代码更改 getView 方法的前 4 行。它应该可以工作。

        View itemView = convertView;
    
       if(itemView == null){ //makes sure we have a view to work with
           LayoutInflater inflater =(LayoutInflater)yourContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           itemView = inflater.inflate(R.layout.itemview, parent , false);
       }
    

    【讨论】:

    • 感谢您的推荐,但我尝试了上述代码的各种形式均无济于事。如果列表视图中有 6 个或更多项目,我仍然会收到空指针异常。
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 2022-11-27
    • 2016-06-15
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多