在自定义适配器中添加浮动横幅时出现android NullPointerException

在自定义适配器中添加浮动横幅时出现android NullPointerException,android,android-listview,banner,Android,Android Listview,Banner,当在listView的每12项之后添加一个横幅时,如果广告横幅是固定的,则listView可以正常工作,但当我包含浮动横幅时 Logcat: 07-01 10:36:00.352: E/AndroidRuntime(31771): FATAL EXCEPTION: main 07-01 10:36:00.352: E/AndroidRuntime(31771): java.lang.NullPointerException 07-01 10:36:00.352: E/AndroidRuntime

当在listView的每12项之后添加一个横幅时,如果广告横幅是固定的,则listView可以正常工作,但当我包含浮动横幅时

Logcat:

07-01 10:36:00.352: E/AndroidRuntime(31771): FATAL EXCEPTION: main
07-01 10:36:00.352: E/AndroidRuntime(31771): java.lang.NullPointerException
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.widget.FrameLayout.onLayout(FrameLayout.java:383)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.View.layout(View.java:11315)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.ViewGroup.layout(ViewGroup.java:4314)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1625)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2642)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.os.Looper.loop(Looper.java:154)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.app.ActivityThread.main(ActivityThread.java:4624)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at java.lang.reflect.Method.invoke(Method.java:511)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at dalvik.system.NativeStart.main(Native Method)
 public MyAdapter(Activity context, ImageManager imageManager) {
    this.context = context;


    annoncesList.clear();
    bannersPositionSet.clear();
}

@Override
public int getCount()
{
    return annoncesList.size();
}

@Override
public Object getItem(int position)
{
    int div = position / 12;
    int restDiv = position % 12;

    if (restDiv == div - 1)
        return (String) annoncesList.get(position);
    else
        return (Annonce) annoncesList.get(position);
}

@Override
public long getItemId(int position)
{
    return position + 1;
}

@Override
public int getItemViewType(int position)
{
    if (bannersPositionSet.contains(position))
    {
        return TYPE_BANNER;
    }
    else
        return TYPE_ANNONCE;
}

@Override
public int getViewTypeCount()
{
    return TYPE_COUNT; // Count of different layouts
}

public void addBannerItem()
{
    annoncesList.add("banner");
    notifyDataSetChanged();
    // save banner position
    bannersPositionSet.add(annoncesList.size() - 1);

}

public void addAllAnnonceItems(List<Annonce> annonceList)
{
    annoncesList.addAll(annonceList);
    notifyDataSetChanged();
}

public void clearList()
{
    annoncesList.clear();
    notifyDataSetChanged();
}

/**
 * Destroy all banners to free memory
 * 
 * this method is used in the method: onDestroy of activity annonceList
 */
public void destroyBanner()
{
    for (SASBannerView banner : bannerList)
    {
        banner.onDestroy();
    }
}

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    ViewHolder viewHolder;
    int type = getItemViewType(position);

    if (convertView == null)
    {
        viewHolder = new ViewHolder();
        switch (type)
        {
            case TYPE_ANNONCE:
                convertView = inflater.inflate(R.layout.annonce_row, null);

                viewHolder.annonceImage = (ImageView) convertView.findViewById(R.id.annonce_image);
                viewHolder.annonceTitle = (TextView) convertView.findViewById(R.id.annonce_title);
                viewHolder.annonceAddress = (TextView) convertView.findViewById(R.id.annonce_seller_city);
                viewHolder.annoncePrice = (TextView) convertView.findViewById(R.id.annonce_price);
                viewHolder.annonceEuroSymbole = (TextView) convertView.findViewById(R.id.euro_symbole);
                viewHolder.annonceFlag = (ImageView) convertView.findViewById(R.id.annonce_flag);
                viewHolder.annonceDate = (TextView) convertView.findViewById(R.id.annonce_date);

                viewHolder.annonceTitle.setTypeface(tfLatoBol);
                viewHolder.annonceAddress.setTypeface(tfLatoReg);
                viewHolder.annoncePrice.setTypeface(tfLatoBol);
                viewHolder.annonceEuroSymbole.setTypeface(tfLatoBol);
                viewHolder.annonceDate.setTypeface(tfLatoReg);
            break;

            case TYPE_BANNER:
                convertView = inflater.inflate(R.layout.floating_android_banner, null);
                viewHolder.floatingBannerView = (SASBannerView) convertView.findViewById(R.id.floating_banner);

                final SASBannerView sasBannerView = viewHolder.floatingBannerView;

                floatingBannerResponseHandler = new SASAdView.AdResponseHandler()
                {
                    public void adLoadingCompleted(SASAdElement adElement)
                    {
                        DebugLog.i(TAG, "floating Banner loading completed");
                        context.runOnUiThread(new Runnable()
                        {

                            @Override
                            public void run()
                            {
                                sasBannerView.setVisibility(View.VISIBLE);
                            }
                        });
                    }

                    public void adLoadingFailed(Exception e)
                    {
                        context.runOnUiThread(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                sasBannerView.setVisibility(View.GONE);
                            }
                        });
                        DebugLog.i(TAG, "floating Banner loading failed: " + e.getMessage());
                    }
                };

            break;
            default:
            break;

        }
        convertView.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if (type == TYPE_BANNER)
    {
        loadFloatingBannerView(viewHolder.floatingBannerView, floatingBannerResponseHandler);
        bannerList.add(viewHolder.floatingBannerView);
    }
    else if (type == TYPE_ANNONCE)
    {
        Annonce annonce = (Annonce) this.getItem(position);
        viewHolder.annonceTitle.setText(Html.fromHtml(annonce.getTitle()));
            }
    return convertView;
}

/**
 * 
 * Load floating banner view
 * 
 */
private void loadFloatingBannerView(SASBannerView floatingBanner,
        SASAdView.AdResponseHandler floatingBannerResponseHandler)
{
    // load floating banner ad with appropriate parameters
    // (siteID,pageID,formatID,master,targeting,adResponseHandler)
    floatingBanner.loadAd(Constants.BANNER_BETWEEN_ANNONCES_SITE_ID, Constants.BANNER_BETWEEN_ANNONCES_PAGE_ID,
            Constants.BANNER_BETWEEN_ANNONCES_FORMAT_ID, true, Constants.BANNER_BETWEEN_ANNONCES_TARGET,
            floatingBannerResponseHandler);
}

private static class ViewHolder
{
    public ImageView annonceImage;
    public TextView annonceTitle;
    public TextView annonceAddress;
    public TextView annoncePrice;
    public TextView annonceEuroSymbole;
    public ImageView annonceFlag;
    public TextView annonceDate;
    public SASBannerView floatingBannerView;
}

}
类适配器:

07-01 10:36:00.352: E/AndroidRuntime(31771): FATAL EXCEPTION: main
07-01 10:36:00.352: E/AndroidRuntime(31771): java.lang.NullPointerException
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.widget.FrameLayout.onLayout(FrameLayout.java:383)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.View.layout(View.java:11315)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.ViewGroup.layout(ViewGroup.java:4314)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1625)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2642)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.os.Looper.loop(Looper.java:154)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at android.app.ActivityThread.main(ActivityThread.java:4624)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at java.lang.reflect.Method.invoke(Method.java:511)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
07-01 10:36:00.352: E/AndroidRuntime(31771):    at dalvik.system.NativeStart.main(Native Method)
 public MyAdapter(Activity context, ImageManager imageManager) {
    this.context = context;


    annoncesList.clear();
    bannersPositionSet.clear();
}

@Override
public int getCount()
{
    return annoncesList.size();
}

@Override
public Object getItem(int position)
{
    int div = position / 12;
    int restDiv = position % 12;

    if (restDiv == div - 1)
        return (String) annoncesList.get(position);
    else
        return (Annonce) annoncesList.get(position);
}

@Override
public long getItemId(int position)
{
    return position + 1;
}

@Override
public int getItemViewType(int position)
{
    if (bannersPositionSet.contains(position))
    {
        return TYPE_BANNER;
    }
    else
        return TYPE_ANNONCE;
}

@Override
public int getViewTypeCount()
{
    return TYPE_COUNT; // Count of different layouts
}

public void addBannerItem()
{
    annoncesList.add("banner");
    notifyDataSetChanged();
    // save banner position
    bannersPositionSet.add(annoncesList.size() - 1);

}

public void addAllAnnonceItems(List<Annonce> annonceList)
{
    annoncesList.addAll(annonceList);
    notifyDataSetChanged();
}

public void clearList()
{
    annoncesList.clear();
    notifyDataSetChanged();
}

/**
 * Destroy all banners to free memory
 * 
 * this method is used in the method: onDestroy of activity annonceList
 */
public void destroyBanner()
{
    for (SASBannerView banner : bannerList)
    {
        banner.onDestroy();
    }
}

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    ViewHolder viewHolder;
    int type = getItemViewType(position);

    if (convertView == null)
    {
        viewHolder = new ViewHolder();
        switch (type)
        {
            case TYPE_ANNONCE:
                convertView = inflater.inflate(R.layout.annonce_row, null);

                viewHolder.annonceImage = (ImageView) convertView.findViewById(R.id.annonce_image);
                viewHolder.annonceTitle = (TextView) convertView.findViewById(R.id.annonce_title);
                viewHolder.annonceAddress = (TextView) convertView.findViewById(R.id.annonce_seller_city);
                viewHolder.annoncePrice = (TextView) convertView.findViewById(R.id.annonce_price);
                viewHolder.annonceEuroSymbole = (TextView) convertView.findViewById(R.id.euro_symbole);
                viewHolder.annonceFlag = (ImageView) convertView.findViewById(R.id.annonce_flag);
                viewHolder.annonceDate = (TextView) convertView.findViewById(R.id.annonce_date);

                viewHolder.annonceTitle.setTypeface(tfLatoBol);
                viewHolder.annonceAddress.setTypeface(tfLatoReg);
                viewHolder.annoncePrice.setTypeface(tfLatoBol);
                viewHolder.annonceEuroSymbole.setTypeface(tfLatoBol);
                viewHolder.annonceDate.setTypeface(tfLatoReg);
            break;

            case TYPE_BANNER:
                convertView = inflater.inflate(R.layout.floating_android_banner, null);
                viewHolder.floatingBannerView = (SASBannerView) convertView.findViewById(R.id.floating_banner);

                final SASBannerView sasBannerView = viewHolder.floatingBannerView;

                floatingBannerResponseHandler = new SASAdView.AdResponseHandler()
                {
                    public void adLoadingCompleted(SASAdElement adElement)
                    {
                        DebugLog.i(TAG, "floating Banner loading completed");
                        context.runOnUiThread(new Runnable()
                        {

                            @Override
                            public void run()
                            {
                                sasBannerView.setVisibility(View.VISIBLE);
                            }
                        });
                    }

                    public void adLoadingFailed(Exception e)
                    {
                        context.runOnUiThread(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                sasBannerView.setVisibility(View.GONE);
                            }
                        });
                        DebugLog.i(TAG, "floating Banner loading failed: " + e.getMessage());
                    }
                };

            break;
            default:
            break;

        }
        convertView.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if (type == TYPE_BANNER)
    {
        loadFloatingBannerView(viewHolder.floatingBannerView, floatingBannerResponseHandler);
        bannerList.add(viewHolder.floatingBannerView);
    }
    else if (type == TYPE_ANNONCE)
    {
        Annonce annonce = (Annonce) this.getItem(position);
        viewHolder.annonceTitle.setText(Html.fromHtml(annonce.getTitle()));
            }
    return convertView;
}

/**
 * 
 * Load floating banner view
 * 
 */
private void loadFloatingBannerView(SASBannerView floatingBanner,
        SASAdView.AdResponseHandler floatingBannerResponseHandler)
{
    // load floating banner ad with appropriate parameters
    // (siteID,pageID,formatID,master,targeting,adResponseHandler)
    floatingBanner.loadAd(Constants.BANNER_BETWEEN_ANNONCES_SITE_ID, Constants.BANNER_BETWEEN_ANNONCES_PAGE_ID,
            Constants.BANNER_BETWEEN_ANNONCES_FORMAT_ID, true, Constants.BANNER_BETWEEN_ANNONCES_TARGET,
            floatingBannerResponseHandler);
}

private static class ViewHolder
{
    public ImageView annonceImage;
    public TextView annonceTitle;
    public TextView annonceAddress;
    public TextView annoncePrice;
    public TextView annonceEuroSymbole;
    public ImageView annonceFlag;
    public TextView annonceDate;
    public SASBannerView floatingBannerView;
}

}
公共MyAdapter(活动上下文,ImageManager){ this.context=上下文; annoncesList.clear(); bannersPositionSet.clear(); } @凌驾 public int getCount() { 返回annoncesList.size(); } @凌驾 公共对象getItem(int位置) { int div=位置/12; int restDiv=位置%12; if(restDiv==div-1) return(String)annoncesList.get(position); 其他的 return(Annonce)annoncesList.get(position); } @凌驾 公共长getItemId(int位置) { 返回位置+1; } @凌驾 public int getItemViewType(int位置) { if(横幅位置集包含(位置)) { 返回类型_横幅; } 其他的 返回类型为一次; } @凌驾 public int getViewTypeCount() { 返回类型\u COUNT;//不同布局的计数 } 公共无效addBannerItem() { 添加(“横幅”); notifyDataSetChanged(); //保存横幅位置 bannersPositionSet.add(annoncesList.size()-1); } public void addAllAnnonceItems(列表annonceList) { addAll(annonceList); notifyDataSetChanged(); } 公共无效清除列表() { annoncesList.clear(); notifyDataSetChanged(); } /** *销毁所有横幅以释放内存 * *此方法用于方法:活动annonceList的onDestroy */ 公共横幅() { 用于(SasbanerView横幅:bannerList) { banner.ondestory(); } } @凌驾 公共视图getView(最终整数位置、视图转换视图、视图组父视图) { 持票人持票人; int type=getItemViewType(位置); if(convertView==null) { viewHolder=新的viewHolder(); 开关(类型) { 案例类型为: convertView=充气机。充气(R.layout.annonce\u行,空); viewHolder.annonceImage=(ImageView)convertView.findViewById(R.id.annonceImage); viewHolder.annonceTitle=(TextView)convertView.findViewById(R.id.annonce\u title); viewHolder.annonceadress=(TextView)convertView.findViewById(R.id.annonce\u seller\u city); viewHolder.annoncePrice=(TextView)convertView.findViewById(R.id.annoncePrice); viewHolder.annonceEuroSymbole=(TextView)convertView.findViewById(R.id.euro\u symbole); viewHolder.annonceFlag=(ImageView)convertView.findViewById(R.id.annonce\u标志); viewHolder.annonceDate=(TextView)convertView.findViewById(R.id.annonce\u日期); viewHolder.annonceTitle.setTypeface(tfLatoBol); viewHolder.annonceAddress.setTypeface(tfLatoReg); viewHolder.annoncePrice.setTypeface(tfLatoBol); viewHolder.annonceEuroSymbole.setTypeface(tfLatoBol); viewHolder.annonceDate.setTypeface(tfLatoReg); 打破 案例类型_横幅: convertView=充气机。充气(R.layout.floating\u android\u banner,null); viewHolder.floatingBannerView=(SASBannerView)convertView.findViewById(R.id.floating_banner); 最终SASBannerView SASBannerView=viewHolder.floatingBannerView; floatingBannerResponseHandler=新的SASAdView.AdResponseHandler() { 已完成公共无效加载(SASADELENT adElement) { DebugLog.i(标记“浮动横幅加载完成”); runOnUiThread(新的Runnable() { @凌驾 公开募捐 { sasbanerview.setVisibility(View.VISIBLE); } }); } public void adLoadingFailed(异常e) { runOnUiThread(新的Runnable() { @凌驾 公开募捐 { sasbanerview.setVisibility(View.GONE); } }); i(标记,“浮动横幅加载失败:”+e.getMessage()); } }; 打破 违约: 打破 } convertView.setTag(viewHolder); } 其他的 { viewHolder=(viewHolder)convertView.getTag(); } 如果(类型==类型_横幅) { loadFloatingBannerView(viewHolder.floatingBannerView,floatingBannerResponseHandler); 添加(viewHolder.floatingBannerView); } else if(type==type\u ANNONCE) { Annonce Annonce=(Annonce)this.getItem(位置); viewHolder.annonceTitle.setText(Html.fromHtml(annonce.getTitle()); } 返回视图; } /** * *加载浮动横幅视图 * */ 私人void loadfloatingbanner视图(Sasbanerview floatingBanner, SASAdView.AdResponseHandler浮动横幅响应处理程序) { //使用适当的参数加载浮动横幅广告 //(siteID、pageID、formatID、master、targeting、adResponseHandler) floatingBanner.loadAd(Constants.BANNER\u在\u ANNONCES\u站点\u ID之间,Constants.BANNER\u在\u ANNONCES\u页面\u ID之间, Constants.BANNER\u-BETWEEN-ANNONCES\u-FORMAT\u-ID,true,Constants.BANNER\u-BETWEEN-ANNONCES\u-TARGET, 浮动横幅响应处理器); } 私有静态类视图持有者 { 公共图像视图; 公共文本视图注释; 公共文本视图; 公共文本视图