0

カスタム アダプターを使用して、JSON 文字列から 20 個のアイテムを読み込み、4 番目と 14 番目の位置に広告を実装しています。私が遭遇したのは、アイテム #19 を表示するためにスクロールすると、タイトルのエラーでクラッシュすることです。

配列にないインデックスにアクセスしようとしているというエラーが表示されていることは知っていますが、インデックスに adViews が含まれているためだと思います (これはすべきではありません)。これは私が見逃している単純なもののように感じますが、助けてください。ここに私の2つのアダプターがあります:

public class ListViewAdapter extends BaseAdapter implements AdListener {

private final Activity activity;
private final BaseAdapter delegate;

public ListViewAdapter(Activity activity, BaseAdapter delegate) {
    this.activity = activity;
    this.delegate = delegate;
}

@Override
public int getCount() {
    // Total count includes list items and ads.
    return delegate.getCount() + 2;
}

@Override
public Object getItem(int position) {
    // Return null if an item is an ad.  Otherwise return the delegate item.
    if (isItemAnAd(position)) {
        return null;
    }
    return delegate.getItem(position - 1);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (isItemAnAd(position)) {
        if (convertView instanceof AdView) {
            return convertView;
        } else {
            AdView adView = new AdView(activity, AdSize.SMART_BANNER,"AD ID (removed for post)" );
            AdRequest adRequest = new AdRequest();
            adView.loadAd(adRequest);
            return adView;
        }
    } else {
        return delegate.getView(position-1, convertView, parent);
    }
}

@Override
public int getViewTypeCount() {
    return delegate.getViewTypeCount() + 1;
}

@Override
public int getItemViewType(int position) {
    if (isItemAnAd(position)) {
        return delegate.getViewTypeCount();
    } else {
        return delegate.getItemViewType(getOffsetPosition(position));
    }
}

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

@Override
public boolean isEnabled(int position) {
    return (!isItemAnAd(position)) && delegate.isEnabled(getOffsetPosition(position));
}

private boolean isItemAnAd(int position) {
    // Place an ad at the first and last list view positions.
    return (position == 4 || position == 14);
}

@Override
public void onDismissScreen(Ad arg0) {
}

@Override
public void onFailedToReceiveAd(Ad arg0, AdRequest.ErrorCode arg1) {
}

@Override
public void onLeaveApplication(Ad arg0) {
}

@Override
public void onPresentScreen(Ad arg0) {
}

@Override
public void onReceiveAd(Ad arg0) {

}

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

}

リストビューを設定するカスタム アダプターは次のとおりです。

class CustomMovieAdapter extends BaseAdapter {

    private ArrayList<SearchResults> searchArrayList;

    private LayoutInflater mInflater;

    public CustomMovieAdapter(Context context, ArrayList<SearchResults> results){

        searchArrayList = results;
        mInflater = LayoutInflater.from(context);
    }


    @Override
    public int getCount() {
        return searchArrayList.size()+2;
    }

    @Override
    public Object getItem(int position) {
        return searchArrayList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = new ViewHolder();

            if(convertView == null){
                convertView = mInflater.inflate(R.layout.list_item, null);
                holder = new ViewHolder();

                assert convertView != null;
                holder.txtRating = (TextView) convertView.findViewById(R.id.movieRating);
                holder.txtMovieName = (TextView) convertView.findViewById(R.id.movieName);
                holder.txtMovieSize = (TextView) convertView.findViewById(R.id.movieSize);
                holder.txtImdbRating = (TextView) convertView.findViewById(R.id.imdbScore);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.txtRating.setText(searchArrayList.get(position+1).getRating());
            holder.txtMovieName.setText(searchArrayList.get(position+1).getName());
            holder.txtMovieSize.setText(searchArrayList.get(position+1).getSize());
            holder.txtImdbRating.setText(searchArrayList.get(position+1).getImdbRating());

        return convertView;

    }
    class ViewHolder {

        TextView txtRating;
        TextView txtMovieName;
        TextView txtMovieSize;
        TextView txtImdbRating;
    }
}
4

1 に答える 1

1
@Override
public int getCount() {
    // Total count includes list items and ads.
    return delegate.getCount() + 2;
}

データセットのサイズを変更せずに返す必要があります。さらにアイテムを表示する必要がある場合は、それらをデータセットに追加します。で変更する

@Override
public int getCount() {
    // Total count includes list items and ads.
    return delegate.getCount() ;
}

例外を修正する必要があります。

編集、getView では、Android が提供する位置を改ざんしないようにする必要があります。

position+1
于 2013-10-30T16:11:58.867 に答える