我有一个由ArrayAdapter填充的ListView,我需要在每个第N个合法列表项后插入一个广告。我能想到的最简单的方法是修改直接(或间接地,通过ArrayAdapter :: add / insert)定义适配器数据集的数组,如下所示:
/**
* Injects ad entries into the station list after every N legit entries
*
* @param adapter the arrayadapter that will generate the views representing our legit and ad list items
*/
private void injectAdEntries(MyArrayAdapter adapter){
int legitItemCount = adapter.getCount();
int adStride = 4;
if(legitItemCount >= adStride) {
//adstride-1 to account for the 0 index
for (int legitItemIndex = adStride-1; legitItemIndex < legitItemCount; legitItemIndex += adStride) {
//create clone of last legit entry, to use as context
// data for the ad, and mark it 'illegitimate' (ad)
LegitObject totallyLegit = new LegitObject(adapter.getItem(legitItemIndex));
totallyLegit.setLegit(false);
adapter.insert(totallyLegit,legitItemIndex+1);
}
}
}
注入后,MyArrayAdapter的getView覆盖可以检测到错误的合法值,并处理与合法条目不同的广告条目。
麻烦的是我不想污染合法的数据阵列。理想情况下,我会插入这些广告列表项而不以任何方式修改基础数据集。有没有办法让适配器生成未在其数据集中反映的视图?
修改
我还需要合法数据集中的所有项目都显示在ListView中;广告列表项目需要“除了”而不是“代替”合法列表项。
答案 0 :(得分:1)
我将假设您使用recyclerView作为列表。因此,要具有异构布局(即:您的实际项目布局+广告布局),您应该按照以下步骤操作:
覆盖getItemView
,如
@Override
public int getItemViewType(int position) {
// insert an Ad every multiple of 5
if (position % 5 == 0) {
return AD_POSITION;
}
return NORMAL_POSITION;
}
接下来,您需要覆盖onCreateViewHolder
方法,根据返回的RecyclerView.Adapter
告诉RecyclerView.ViewHolder
要创建哪个viewType
对象。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder viewHolder;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
switch (viewType) {
case AD_POSITION:
View v1 = inflater.inflate(R.layout.list_item_ad, viewGroup, false);
viewHolder = new AdViewHolder(v1);
break;
default:
// NORMAL_POSITION
View v = inflater.inflate(R.layout.list_item, viewGroup, false);
viewHolder = new NormalViewHolder(v);
break;
}
return viewHolder;
}
有关详细信息,请查看此link。