2017-03-31 24 views
0

我有一個ListView由ArrayAdapter填充,我需要在每個第N個合法列表項後插入一個廣告。我能想到的最簡單的方法是修改定義適配器的數據直接設置陣列(或間接地通過ArrayAdapter ::添加/插入),如下所示:如何在不修改底層數據集的情況下將列表項插入列表視圖?

/** 
* 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

我會假定您正在使用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方法根據返回的viewType告訴RecyclerView.Adapter要創建哪個對象RecyclerView.ViewHolder

    @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出來。

+0

0123對於這個建議,但我目前的實現基於ListView + ArrayAdapter,理想情況下我想找到一個可以在該框架內工作的解決方案(如果可能的話)。此外,我不確定我想承諾這樣一個新的框架類(RecyclerView被添加到API級別22),現在支持庫最低API級別似乎已經爬到了9層[https:// developer .android.com/topic/libraries/support-library/index.html#api-versions] - 在可預見的將來,我需要支持16個。 – CCJ

+0

這種方法是否仍然需要修改底層數據集? RecyclerView的適配器和佈局位置必須來自給予RecyclerView.Adapter的數據集(我認爲),所以雖然您可以顯示具有按位置確定的項目視圖類型的好處的異構數據,但所述數據仍然必須來自單一來源。在上面的例子中,在5的倍數的位置上的正常條目是否會被有效地放棄以支持廣告?無論如何,我的目標是儘可能將普通列表項的數據與廣告分開。 – CCJ

+0

對於您的**第一條評論**,我認爲您只會在性能(特別是)方面獲得更多優勢,並且不會因爲轉移到RecyclerView而丟失任何內容,並且如果您支持API 9,則支持差不多99%的Android手機。對於你的**第二條評論**,我對你的數據並不瞭解太多(你傳遞給適配器),但我相信你不必做很多調整就可以使它工作。 –

相關問題