我有下面的代码,除了它总是隐藏列表视图中的至少一个真实项目,因为广告显示在该位置.
问题示例:我有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)
实现这一目标的方法不止一种.最好的方法是依靠listView的能力来回收多种项目类型.
在适配器中,
这里有一个关于如何在列表中使用不同项类型的好教程:具体来说,请查看"不同列表项"布局".
之后,您需要对索引进行少量算术转换,以便将位置映射到数据结构中的正确位置(或者,您可以合并数据结构以包括广告数据和项目数据).
基本上,您不需要使用items.size(),而是需要使用items.size()+ Math.floor(items.size()/ NTH_ITEM),当您获得该位置时,如果它是广告位置(位置%NTH_ITEM == 0)使用像Math.floor(position/NTH_ITEM)这样的简单转换从广告数据结构中提取,并以类似的方式提取项目的结构.
您应该依赖ListView的holder模式来重用您的不同项视图类型,就像上面的教程一样.
不同的方法,仅用于概念,包括使用项目包装器将数据源合并为一个,并通过使用类型属性(如枚举)或合并两个特定适配器的"合并适配器"来区分项目(这可能如果要在不同的列表中包含这些视图类型,则具有更好的模块性.
如果您在使用案例中需要任何帮助来实现特定部分,请告诉我们.
| 归档时间: |
|
| 查看次数: |
5369 次 |
| 最近记录: |