Android横幅广告未按预期显示在Listview中

时间:2014-06-07 16:02:06

标签: android android-listview admob

我尝试创建一个每隔n个间隔包含横幅广告的列表视图。在我的代码中,它每6个项目。我已根据示例here创建了我的代码。提供的示例基于在列表视图的第一个和最后一个处放置横幅广告,因此我在尝试以相等的间隔在列表视图中散布横幅广告时遇到了问题。具体来说,我的广告每次都不会显示。我从下面的代码得到的结果是在第7,8位显示连续两个广告,然后在第13位显示我的第三个广告。我不确定是什么原因导致第8位广告出现。

知道如何解决这个问题吗?

以下代码......

首先,创建我的SimpleCursorAdapter,在这种情况下包含大约14个字符串以显示在列表视图中。

// Create and populate listview 
final ListView listview = (ListView) findViewById(android.R.id.list);

// SimpleCursorAdapter method
Cursor c = dbh.getAllCategoriesCursor();
startManagingCursor(c);

String[] from = new String[] { "name" };
int[] to = new int[] { R.id.category_label};

// Now create an array adapter and set it to display using our row
SimpleCursorAdapter cursorAdapter =
    new SimpleCursorAdapter(this, R.layout.rowlayout, c, from, to, 0);

setListAdapter(new ListViewAdapter(this, cursorAdapter));

这是我的ListViewAdapter,扩展了BaseAdapter类

public class ListViewAdapter extends BaseAdapter {

    private Activity mContext;  
    private SimpleCursorAdapter listAdapter;  
    private LayoutInflater mLayoutInflater;  
    private int k = 6; // interval ad every 6 items
    int baseItems;
    int noAds; // used for listview offset

    // Constructor takes in a BaseAdapter 
    public ListViewAdapter(Activity activity, SimpleCursorAdapter delegate) {
        mContext = activity;  
        listAdapter = delegate; 
        baseItems = listAdapter.getCount();
        noAds  = baseItems / k;
        mLayoutInflater = (LayoutInflater) mContext  
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }



    @Override
    public int getCount() {
        // Total count includes list items and ads.
        return baseItems + noAds;
    }

    @Override
    public Object getItem(int position) {
        // Return null if an item is an ad.  Otherwise return the delegate item.
        if (isItemAnAd(position)) {
            return null;
        }
        return listAdapter.getItem(getOffsetPosition(position));
    }

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

    @Override
    public int getViewTypeCount() {
        return listAdapter.getViewTypeCount() + noAds;
    }

    @Override
    public int getItemViewType(int position) {
        if (isItemAnAd(position)) {
            return listAdapter.getViewTypeCount();
        } else {
            return listAdapter.getItemViewType(getOffsetPosition(position));
        }
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        return (!isItemAnAd(position)) && listAdapter.isEnabled(getOffsetPosition(position));
    }

    private boolean isItemAnAd(int position) {
        // Place an ad at the first and last list view positions.
        // -- should override for every kth positions
        if (position == 0) return false;
        // Calculate offsets caused by ads already embedded
        int offset = 0;
        if (position > k){
            int div = position / k;
            offset = div;
        }
        return ((position-offset) % k == 0);

    }


    // Get the position that is offset by the insertion of the ads
    private int getOffsetPosition(int position) {

        return position - noAds;

    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // Display every n list items
        if (isItemAnAd(position)) {
            if (convertView instanceof AdView) {
                // Don’t instantiate new AdView, reuse old one
                return convertView;
            } else {
                // Create a new AdView
                AdView adView = new AdView(getApplicationContext());
                adView.setAdSize(AdSize.BANNER);
                adView.setAdUnitId(BANNER_AD_ID);

                // Disable focus for sub-views of the AdView to avoid problems with
                // trackpad navigation of the list.
                for (int i = 0; i < adView.getChildCount(); i++)
                {
                    adView.getChildAt(i).setFocusable(false);
                }
                adView.setFocusable(false);

                // Convert the default layout parameters so that they play nice with
                // ListView.

                float density = getApplicationContext().getResources().getDisplayMetrics().density;
                int height = Math.round(AdSize.BANNER.getHeight() * density);
                AbsListView.LayoutParams params = new AbsListView.LayoutParams(
                        AbsListView.LayoutParams.MATCH_PARENT,
                        height);
                adView.setLayoutParams(params);
                AdRequest bannerIntermediateReq = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice("d9e108ab") //means that a test ad is shown on my phone
                .build();

                adView.loadAd(bannerIntermediateReq);

                return adView;
            }
        } else {

            // Offload displaying other items to the delegate 
            return listAdapter.getView(position - (int) Math.ceil(position / k),
                    convertView, parent);

        }
    }
}

更新9/6 ...找到一种解决方法,在第n个时间间隔创建广告,然后按n-1间隔创建所有后续广告。因此,如果我设置n = 8,我会在8个列表项之后插入广告,之后每7个项目插入一次广告。考虑到我沉入其中的时间,我很高兴能够满足于此。它可能是某个我无法找到的错误的错误。希望这在某些方面可以帮助某人。以下是修改:

private boolean isItemAnAd(int position) {


        if (position < k) return false;
        // Calculate current offset caused by ads already embedded

        if (position==k){
            return true;
        }
        else {
            return isItemAnAd(position-k);
        }


    }

// Get the position that is offset by the insertion of the ads
        private int getOffsetPosition(int position) {
            int currentNoAds = position / k;
            return position - currentNoAds;

        }

,在getView中......

return listAdapter.getView(getOffsetPosition(position) ,
                        convertView, parent);

0 个答案:

没有答案