0

I want to integrate ads inside a ListView and I have the following code:

UPDATED AdViewHelper.java

  public LinearLayout configureAdViewWithLayoutContainer(final Activity context) {

    final LinearLayout layout = new LinearLayout(context);
    layout.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
            AbsListView.LayoutParams.WRAP_CONTENT));
    layout.setGravity(Gravity.CENTER);

    PublisherAdView adView = new PublisherAdView(context);
    adView.setLayoutParams(new LinearLayout.LayoutParams(context.getResources().getInteger(R.integer.google_ads_width),
            context.getResources().getInteger(R.integer.google_ads_height)));
    adView.setId(R.id.ad_view_id);
    adView.setAdUnitId("MY_UNIT_ID");
    adView.setAdSizes(getAdSize(context));
    adView.setVisibility(View.GONE);
    final PublisherAdView finalAdView = adView;
    adView.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            finalAdView.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
            super.onAdFailedToLoad(errorCode);
        }
    });
    adView.setAppEventListener(this);

    layout.addView(adView);

    return layout;
}

In the MyAdapter.java

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
if (getItemViewType(position) == AD_TYPE) {
     return adViewHelper.configureAdViewWithLayoutContainer(activity);    
 } else {
      return convertView = inflater.inflate(R.layout.product_row, parent, false);
    }
}

Note: Please ignore the ViewHolder and recycling. It's not the purpose of this question.

So, the problem is that I get the following error:

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
        at android.widget.ListView.setupChild(ListView.java:1826)
        at android.widget.ListView.makeAndAddView(ListView.java:1793)
        at android.widget.ListView.fillDown(ListView.java:691)
        at android.widget.ListView.fillFromTop(ListView.java:752)
        at android.widget.ListView.layoutChildren(ListView.java:1630)
        at android.widget.AbsListView.onLayout(AbsListView.java:2087)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:14817)
        at android.view.ViewGroup.layout(ViewGroup.java:4631)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
        at android.view.Choreographer.doFrame(Choreographer.java:544)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

I know that this is because my PublisherAdView is inside a LinearLayout, but I need that LinearLayout in order to make the visibility of ad to work (when the user opens the screen the ad row should be hidden until is loaded).

How can I still use the LinearLayout and yet get rid of this class cast exception?

7
  • change LinearLayout.LayoutParams with AbsListView.LayoutParams. Remember that the LayoutParams object refers always to the parent Commented Mar 18, 2015 at 11:06
  • I already tried that, but I still get this exception. Commented Mar 18, 2015 at 11:13
  • you mean on this line: layout.setLayoutParams(new LinearLayout.LayoutParams? Commented Mar 18, 2015 at 11:14
  • Yes. This is the code: layout.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); Commented Mar 18, 2015 at 11:15
  • this adView.setLayoutParams(new AbsListView.LayoutParams( should take LinearLayout.LayoutParams since is direct child of a LinearLayout Commented Mar 18, 2015 at 11:16

1 Answer 1

1

It happens here:

layout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));

layout is used in ListView, so it should have AbsListView.LayoutParams

Then here:

adView.setLayoutParams(new AbsListView.LayoutParams(
        context.getResources().getInteger(R.integer.google_ads_width),
        context.getResources().getInteger(R.integer.google_ads_height)));

Your layout is a LinearLayout, so its children should have LinearLayout.LayoutParams.

So you basically did it vice versa now :)

Sign up to request clarification or add additional context in comments.

2 Comments

Post a full stacktrace, please.
I figured out where my mistake was thanks to your suggestion. I was using the adView in another part of the code also and for some reason I had to add there the layoutParams. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.