2013-11-02 3 views
0

Я пытаюсь поместить несколько просмотров в список, но даже когда я использую getItemViewType() и getViewTypeCount), это не работает, ошибка: «ArrayIndexOutofBoundsException length = 2; индекс = 2;добавить еще один вид в середине списка

Вот мой код:

public class SearchAdapter extends BaseAdapter { 
private static final int TYPE_MOVIE = 1; 
private static final int TYPE_ADS = 2; 
private Context context; 
private List<MovieObject> movies; 
private LayoutInflater inflater; 

public SearchAdapter(Context context, List<MovieObject> movies) { 
    this.context = context; 
    this.movies = movies; 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getViewTypeCount() { 
    // TODO Auto-generated method stub 
    return 2; 
} 

@Override 
public int getItemViewType(int position) { 
    int separator = (movies.size()/2) + 1; 
    if (position == separator) { 
     return TYPE_ADS; 
    } else { 
     return TYPE_MOVIE; 
    } 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return movies.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return movies.get(position); 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    int type = getItemViewType(position); 
    View v = convertView; 
    ViewHolder h = null; 
    ViewHolderAds h2 = null; 
    if (v == null) { 
     h = new ViewHolder(); 
     switch (type) { 
     case TYPE_MOVIE: 
      v = inflater.inflate(R.layout.adapter_search, null); 
      h = new ViewHolder(); 
      break; 
     case TYPE_ADS: 
      v = inflater.inflate(R.layout.view_ads, null); 
      h2 = new ViewHolderAds(); 
      v.setTag(h2); 
      break; 
     default: 
      break; 
     } 
     v.setTag(h); 
    } else { 
     if (type == TYPE_MOVIE) { 
      h = (ViewHolder) v.getTag(); 
     } else { 
      h2 = (ViewHolderAds) v.getTag(); 
     } 

    } 
    return v; 
} 

private class ViewHolder { 
    TextView tv_title, tv_date, tv_certification, tv_runtime; 
} 

private class ViewHolderAds { 

} 
} 

ответ

0

Изменить

private static final int TYPE_MOVIE = 1; 
private static final int TYPE_ADS = 2; 

с

private static final int TYPE_MOVIE = 0; 
private static final int TYPE_ADS = 1; 

внутри андроид использует эти константы как индекс для массива взглядов, размера возвращаемого getViewTypeCount(), и вы не можете иметь массив размера 2 с индексом 2 (тот, что исключение говорит вам)

+0

Хорошо, спасибо, что это работает, но по соответствующей заметке, когда я это делаю, я потерял один мой объект фильма, который должен был находиться на позиции: int separator = (movies.size()/2) + 1; Как я могу добавить еще один вид вместо замены? – Tsunaze

+0

Я не понимаю. Не могли бы вы перефразировать? – Blackbelt

+0

Я хочу, чтобы поставить еще один объект, а не фильм (это объявление) между двумя фильмами. Я намеревался разместить объявление в середине страницы. Но когда я использую этот метод, он накладывает на фильм место вместо объявления. – Tsunaze

Смежные вопросы