如何在listView中的每个第n个位置显示AdView

cod*_*441 4 android listview

我有下面的代码,除了它总是隐藏列表视图中的至少一个真实项目,因为广告显示在该位置.

问题示例:我有4次列表,adView显示在列表视图的第3位.我只能看到3次和AdView,第4项没有显示

我每次返回广告时都会增加适配器的大小,但它不能很好地工作.

有任何想法吗?

public View getView(final int position, View row, ViewGroup parent) {
        MyHolder holder = null;
        boolean showAd = proVersion == false && (position % 8 == k);
        if (showAd) {
            AdView adView = adList.get(position);
            if (adView == null) {
                AdView adViewNew = new AdView((Activity) context, AdSize.BANNER, context.getResources().getString(
                        R.string.adId));
                adViewNew.loadAd(Utils.getAdRequest("gps", lat, lng, keywords));
                adList.add(position, adViewNew);
                return adViewNew;
            } else {
                return adView;
            }
        } else if (row == null || row instanceof AdView) {
            LayoutInflater inflater = ((SherlockActivity) context).getLayoutInflater();
            row = inflater.inflate(viewResourceId, parent, false);
            holder = new MyHolder();
            holder.textName = (TextView) row.findViewById(R.id.name);           
            row.setTag(holder);
        } else {
            holder = (MyHolder) row.getTag();
        }
        holder.textName.setText(items.get(position).getName());

        // more code

        return row;
    }

    @Override
    public int getCount() {
        if (items != null) {
            return items.size();
        } else {
            return 0;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ben*_*ein 6

实现这一目标的方法不止一种.最好的方法是依靠listView的能力来回收多种项目类型.

在适配器中,

  1. getViewTypeCount() - 返回listView中有多少行类型的信息
  2. getItemViewType(int position)根据位置返回应使用哪种布局类型的信息.这就是你确定listView对象的逻辑应该去的地方.

这里有一个关于如何在列表中使用不同项类型的好教程:具体来说,请查看"不同列表项"布局".

之后,您需要对索引进行少量算术转换,以便将位置映射到数据结构中的正确位置(或者,您可以合并数据结构以包括广告数据和项目数据).

基本上,您不需要使用items.size(),而是需要使用items.size()+ Math.floor(items.size()/ NTH_ITEM),当您获得该位置时,如果它是广告位置(位置%NTH_ITEM == 0)使用像Math.floor(position/NTH_ITEM)这样的简单转换从广告数据结构中提取,并以类似的方式提取项目的结构.

您应该依赖ListView的holder模式来重用您的不同项视图类型,就像上面的教程一样.

不同的方法,仅用于概念,包括使用项目包装器将数据源合并为一个,并通过使用类型属性(如枚举)或合并两个特定适配器的"合并适配器"来区分项目(这可能如果要在不同的列表中包含这些视图类型,则具有更好的模块性.

如果您在使用案例中需要任何帮助来实现特定部分,请告诉我们.