如何在不修改基础数据集的情况下将列表项插入到listview中?

时间:2017-03-31 22:22:11

标签: android listview android-arrayadapter

我有一个由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中;广告列表项目需要“除了”而不是“代替”合法列表项。

1 个答案:

答案 0 :(得分:1)

我将假设您使用recyclerView作为列表。因此,要具有异构布局(即:您的实际项目布局+广告布局),您应该按照以下步骤操作:

  1. 覆盖getItemView,如

    @Override
    public int getItemViewType(int position) {
        // insert an Ad every multiple of 5
        if (position % 5 == 0) {
            return AD_POSITION;
        }
        return NORMAL_POSITION;
    }
    
  2. 接下来,您需要覆盖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;
    }
    
  3. 有关详细信息,请查看此link