【问题标题】:adding one more view in the middle of the listview在列表视图的中间再添加一个视图
【发布时间】:2013-11-02 08:21:49
【问题描述】:

我试图将多个视图放入一个列表视图中,但即使我使用 getItemViewType() 和 getViewTypeCount),它也不起作用,错误是:“ArrayIndexOutofBoundsException length=2; index=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 {

}
}

【问题讨论】:

    标签: android listview android-adapter


    【解决方案1】:

    改变

    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;
    

    在内部,android 使用这些常量作为视图数组的索引,其大小由getViewTypeCount() 返回,并且您不能拥有一个大小为 2 且索引为 2 的数组(这就是异常告诉您的内容)

    【讨论】:

    • 好的,谢谢它正在工作,但是在相关说明中,当我这样做时,我丢失了一个电影对象,该对象应该在位置:int separator = (movies.大小()/2)+ 1;如何添加更多视图而不是替换?
    • 我不明白。你能改写一下吗?
    • 我想要的是在两部电影之间再放一个对象,这不是电影(它是广告)。我打算把广告放在页面中间。但是当我使用这种方法时,它会覆盖电影而不是放置广告。
    • 你必须按照你想要的方式排列数据集中的项目。如果我在你身边,我不依赖位置,但我会将有关我要展示的对象类型的信息与我要展示的项目相关联
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多