在自定义适配器中添加浮动横幅时出现android NullPointerException
当在listView的每12项之后添加一个横幅时,如果广告横幅是固定的,则listView可以正常工作,但当我包含浮动横幅时 Logcat:在自定义适配器中添加浮动横幅时出现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
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,
浮动横幅响应处理器);
}
私有静态类视图持有者
{
公共图像视图;
公共文本视图注释;
公共文本视图;
公共文本视图