2012-11-26 85 views
0

我希望在列表視圖中插入廣告,但是從admob提供的示例中,它在構造函數中使用BaseAdapter,而我使用的是ArrayList<Hashmap>因此,我現在非常困惑,請幫助我出去了。getViewTypeCount&getItemViewType方法的麻煩

public class ListAdapter extends BaseAdapter implements AdListener{ 

private static String admobId = null; 
private Activity activity; 
private ArrayList<HashMap<String, String>> data; 

private static LayoutInflater inflater=null; 

public ListAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    this.activity = a; 
    this.data = d; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public int getCount() { 
    return data.size()+1; //Adding one ads 
} 

public Object getItem(int position) { 
    if (isItemAnAd(position)) { 
     return null; 
    } 
    return data.get(getOffsetPosition(position)); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 

    if (isItemAnAd(position)) { 
      if (vi instanceof AdView) { 
      Log.d(LOGTAG, "I am reusing an ad"); 
      return vi; 
      } else { 
      Log.d(LOGTAG, "I am creating a new ad"); 
      AdView adView = new AdView(activity, AdSize.SMART_BANNER, getAdmobId(activity)); 
      AdRequest adRequestBanner = new AdRequest(); 
      adView.loadAd(adRequestBanner); 
      return adView; 
      } 
    } else { 

    vi = inflater.inflate(R.layout.listview, null); 
    TextView subject = (TextView)vi.findViewById(R.id.subject); 
    TextView permalink = (TextView)vi.findViewById(R.id.permalink); 

    HashMap<String, String> map = new HashMap<String, String>(); 
    map = data.get(position); 
    //Setting all values in listview 

     subject.setText(map.get(ViewPagerAdapter.KEY_NEWS_SUBJECT)); 
     permalink.setText(map.get(ViewPagerAdapter.KEY_NEWS_PERMA)); 

    return vi; 
     } 
} 

@Override 
public int getViewTypeCount() { 
//what should i write here? 
} 

@Override 
public int getItemViewType(int position) { 
//what should i write here? 
} 

//Ads 
@Override 
public boolean areAllItemsEnabled() { 
    return false; 
} 

@Override 
public boolean isEnabled(int position) { 
    return (!isItemAnAd(position)); 
} 

private boolean isItemAnAd(int position) { 
    // Place an ad at the first 
    return (position == 0); 
} 

private int getOffsetPosition(int position) { 
    return position - 1; 
} 
} 

我應該getViewTypeCount() & getItemViewType()寫什麼方式。

更新:

@Override 
public int getViewTypeCount() { 
    return 2; 
} 
@Override 
public int getItemViewType(int position) { 
    if (isItemAnAd(position)) { 
      return 0; 
     } else { 
      return 1; 
     } 
} 

回答

4

您列表視圖中有2種行:廣告和正常行。所以getViewTypeCount應該返回2.讓我們給出廣告行類型0和普通行類型1.如果isItemAnAd爲真,則getItemViewType應該返回0,否則返回1。

+0

嗨尼基塔,我跟着你的方法,但有一個小問題。廣告接管第一個listview項並導致IndexOutOfBoundsException:無效索引13,大小爲13 ?原因是什麼? – Eric

+0

嗯,問題是當你在'getView'方法中,position是1時,這意味着你需要從數據中獲取第一項,所以你應該在這一行中使用'getOffsetPosition'而不是'position':'map = data .get(position);' –

+0

非常感謝Nikita!它現在有效。順便問一下,如果我想讓listview中的一個項目與其他項目不同,我使用類似的方法? getviewtypecount()變成3?例如 – Eric