【问题标题】:trouble in getViewTypeCount & getItemViewType methodsgetViewTypeCount 和 getItemViewType 方法中的问题
【发布时间】:2012-11-26 07:06:51
【问题描述】:

我希望在列表视图顶部插入一个广告,但是从 admob 提供的示例中,它在构造函数中使用 BaseAdapter 而我使用 ArrayList<Hashmap> 因此我现在很困惑,请帮帮我.

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;
        }
}

【问题讨论】:

    标签: android android-listview admob baseadapter


    【解决方案1】:

    您的列表视图有 2 种行:广告行和普通行。所以getViewTypeCount 应该返回 2。让我们给广告行类型 0 和普通行类型 1。如果 isItemAnAd 为真,则getItemViewType 应该返回 0,否则返回 1。

    【讨论】:

    • 您好 Nikita,我已经按照您的方法进行了操作,但是有一个小问题。广告接管第一个列表视图项并导致 IndexOutOfBoundsException: Invalid index 13, size is 13 ?原因是什么?
    • 啊,问题是当您在 getView 方法中并且位置为 1 时,这意味着您需要从数据中获取第一项,因此您应该使用您的 getOffsetPosition 而不是 position这一行:map = data.get(position);
    • 非常感谢尼基塔!现在可以了。顺便问一下,如果我想让列表视图中的一项与其他项不同,我使用类似的方法吗? getviewtypecount() 变成 3?
    • 例如,在列表视图布局中的每 4 个项目上,仅显示图像横幅,这与其余的有文本不同。
    • @NikitaBeloglazov :为什么要实现getItemViewType() 虽然这已经在getView() 中完成了调用if (isItemAnAd(position)) { 语句时,我认为两者都会做同样的事情,所以,为什么要调用这里有另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多